多线程 17 多线程题1

(1)原始:

**

 * 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,

 * 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下:

 */

public class Test {

 

    public static void main(String[] args) {

        System.out.println("begin:" + (System.currentTimeMillis() / 1000));

                                /*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。

                                修改程序代码,开四个线程让这16个对象在4秒钟打完。

                                */

        for (int i = 0; i < 16; i++) {  //这行代码不能改动

            final String log = "" + (i + 1);//这行代码不能改动

            {

                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();

        }

    }

 

}

(2)

改后:

/**

 * 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,

 * 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下:

 */

public class Test {

 

    public static void main(String[] args) {

        final BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(1);//或16有啥区别,其实1即可

        for (int i = 0; i < 4; i++) {

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while(true){

                        try {

                            final String log = blockingQueue.take();

                            Test.parseLog(log);

                        } catch (InterruptedException e) {

                            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 {

                    blockingQueue.put(log);

                } catch (InterruptedException e) {

                    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();

        }

    }

 

}

如有疑问,请发邮件:[email protected]


github:??https://github.com/wangrui0/

猜你喜欢

转载自blog.csdn.net/qq_35524586/article/details/84983219
今日推荐