《张孝祥Java多线程与并发库高级应用视频教程》中关于“空中网面试题1”的代码,用了BlockingQueue阻塞队列,增加了一个循环,为什么不用Executors?改进完以后不用增加循环,而且代码更简单,结果一样。
这是原文代码:
- package read;
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- public class Test {
-
- public static void main(String[] args){
- final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
- for(int i=0;i<4;i++){
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- String log = queue.take();
- parseLog(log);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
-
- }).start();
- }
-
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
- /*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
- 修改程序代码,开四个线程让这16个对象在4秒钟打完。
- */
- for(int i=0;i<16;i++){ //这行代码不能改动
- final String log = ""+(i+1);//这行代码不能改动
- {
- try {
- queue.put(log);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //Test.parseLog(log);
- }
- }
- }
-
- //parseLog方法内部的代码不能改动
- public static void parseLog(String log){
- System.out.println(log+":"+(System.currentTimeMillis()/1000));
-
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- }
复制代码
这是改进的:
- package read;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class t {
- public static void main(String[] args) {
- System.out.println("begin:" + (System.currentTimeMillis() / 1000));
- /*
- * 模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
- * 修改程序代码,开四个线程让这16个对象在4秒钟打完。
- */
- ExecutorService es = Executors.newFixedThreadPool(4);
- for (int i = 0; i < 16; i++) { // 这行代码不能改动
- final String log = "" + (i + 1);// 这行代码不能改动
- es.execute(new Runnable() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- Test.parseLog(log);
- }
- });
- }
- es.shutdown();
- }
- // parseLog方法内部的代码不能改动
- public static void parseLog(String log) {
- System.out.println(log + ":" + (System.currentTimeMillis() / 1000));
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
复制代码 |
|