Java编程一道多线程问题实例代码

  

前面几篇博文基本上总结了一下java并发里的一些内容,这篇博文主要从一个问题入手,看看都能用到前面总结的哪些并发技术去解决。

  

题目描述:
  

  
  

模拟一个场景:处理16条日志记录,每条日志记录打印时间需要1秒,正常情况下如果将这16条记录去部打完需要16秒,现在为了提高效率,准备开启4个线程去打印,4秒钟打印完,实现这个演示。
  

     

先来分析一下这个题目,关于这16条日志记录,我们可以在主线程中产生出来,这没用什么难度,关键是开启4个线程去执行,现在有两种思路:一种是日志的产生和打印日志的线程在逻辑上分开;一种是日志的产生和打印日志的线程在逻辑上不是分开的。这样说可能有点晦涩、下面我针对这两种思路,写个实现的演示就好理解了。
  

  

思路一

  

日志产生和日志打印在逻辑上是分开的。
  

  

这相当于两条战线:一条战线在不停的产生日志,另一个战线在不停的打印日志。很明显会想到阻塞队列的使用,产生日志不停的往阻塞队列中塞,打印日志不停的从阻塞队列中取,阻塞队列的大小可以自己设置,可以设置16个,也可以设置为1个,这都不影响执行。所以会用到BlockingQueue、下面看一下实现的演示:

        公开课Practice1 {   公共静态void main (String [] args) {//定义一个阻塞队列,队列大小可以装16个信息   BlockingQueue队列=new ArrayBlockingQueue (16);   for (int i=0;我& lt;4;我+ +){//开启四个线程去阻塞队列中取日志打印   新线程(新Runnable () {   @Override   公共空间run () {   而(真){   尝试{   字符串日志=queue.take ();//取日志   parseLog(日志);//打印日志   }   抓住(InterruptedException e) {//TODO自动生成的catch块   e.printStackTrace ();   }   }   }   }   ).start ();   }   system . out。println(“开始:”+ (System.currentTimeMillis ()/1000));   for (int i=0;我& lt;16;我+ +){   最终字符串日志=" + (i + 1);//表示一个日志   尝试{   queue.put(日志);//将产生的日志塞到阻塞队列中去   }   抓住(InterruptedException e) {//TODO自动生成的catch块   e.printStackTrace ();   }   }   }   公共静态孔隙parseLog(字符串日志){//打印日志的方法   System.out.println (Thread.currentThread () . getname () +“- - -”   +日志+“- - -”+ (System.currentTimeMillis ()/1000));   尝试{   thread . sleep (1000);//模拟打印一次日志需要1秒   }   抓住(InterruptedException e) {//TODO自动生成的catch块   e.printStackTrace ();   }   }   }      

这就好比一个系统正在运作,一边不停的产生日志,一边在不停的开启多个线程去打印日志信息,这个演示就写好了,运行结果就不贴了。
  

  

思路二

  

日志产生和日志打印在逻辑上不是分开的。
  

  

这种思路就是,我产生日志的同时,你就给我打印出来,四个线程一起干!那么这种思路的话,就得用到线程池了,我一开始创建一个线程池,里面装了4个线程,然后产生日志的时候,我让这个线程池拿线程去执行它即可.demo如下:

        公开课Practice1 {   公共静态void main (String [] args) {   ExecutorService服务=Executors.newFixedThreadPool (4);//创建一个线程池   system . out。println(“开始:”+ (System.currentTimeMillis ()/1000));   for (int i=0;我& lt;16;我+ +){   最终字符串日志=" + (i + 1);//表示一个日志   服务。执行(新Runnable () {//拿一个线程去执行   @Override   公共空间run () {   parseLog(日志);   }   }   );   }   service.shutdown ();//最后别忘了关掉线程池   }   公共静态孔隙parseLog(字符串日志){   System.out.println (Thread.currentThread () . getname () +“- - -”   +日志+“- - -”+ (System.currentTimeMillis ()/1000));   尝试{   thread . sleep (1000);//模拟打印一次日志需要1秒   }   抓住(InterruptedException e) {//TODO自动生成的catch块   e.printStackTrace ();   }   }   }      

关于这个问题,就总结到这吧,把这两种思路搞清楚一般就可以有效的解决了。

  

总结

  

以上就是本文关于Java编程一道多线程问题实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Java编程一道多线程问题实例代码