多线程同步问题-练习题1-笔记整理

来源:互联网 发布:淘宝小崔韩代 编辑:程序博客网 时间:2024/05/23 21:06

练习题1

现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,
请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,
程序只需要运行4秒即可打印完这些日志对象。
 
 
解决方案:将主线程中产生的数据存入到阻塞队列中,启动的四个消费者线程一次去队列中取数据。


题目代码示例:

/* 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志, 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象, 程序只需要运行4秒即可打印完这些日志对象。 */public class Test1 {public static void main(String[] args) {System.out.println("begin"+System.currentTimeMillis()/1000);for (int i = 0; i < 16; i++) {String log=""+(i+1);{Test1.parseLog(log);   //关键点是在此处理}}}public static void parseLog(String log){System.out.println(log+":"+System.currentTimeMillis()/1000);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}

改进后代码示例:

/* 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志, 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象, 程序只需要运行4秒即可打印完这些日志对象。   解决方案:将主线程中产生的数据存入到阻塞队列中,启动的四个消费者线程一次去队列中取数据。 */public class Test1_1 {public static void main(String[] args) {System.out.println("begin"+System.currentTimeMillis()/1000);final BlockingQueue<String> blockingQueue=new ArrayBlockingQueue<String>(16);for (int i = 0; i < 4; i++) {new Thread(new Runnable() {@Overridepublic void run() {while(true){try {String data = blockingQueue.take();parseLog(data);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}for (int i = 0; i < 16; i++) {String log=""+(i+1);{try {blockingQueue.put(log);} catch (InterruptedException e) {e.printStackTrace();}//Test1_1.parseLog(log);   //关键点是在此处理}}}public static void parseLog(String log){System.out.println(log+":"+System.currentTimeMillis()/1000);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}




0 0
原创粉丝点击