题目如下:现有程序代码模拟产生16个日志对象,并且需要运行16秒才能打印完这些日志。程序代码如下:
- 单线程打印16条日志的例子
- public class CopyOfTest {
- /*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
- 修改程序代码,开四个线程让这16个对象在4秒钟打完。
- */
- public static void main(String[] args){
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
- 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();
- }
- }
- }
上面的程序是单线程打印16条日志,需要16秒打印完成。运行结果如下:
现在要求修改程序(代码中不能改动的地方已经给出),开4个线程,让这16条日志在4秒内打印完成。修改后的代码如下:
- 1-2 四个线程在4秒内打印16条“日志”的例子
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- public class Test {
- /*模拟处理16行日志,下面的代码产生了16个日志对象,当前代码需要运行16秒才能打印完这些日志。
- 修改程序代码,开四个线程让这16个对象在4秒钟打完。
- */
- public static void main(String[] args){
- //定一个阻塞队列
- final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1);
- for(int i=0;i<4;i++){//创建4个线程
- new Thread(new Runnable(){
- @Override
- public void run() {
- while(true){
- try {
- String log = queue.take();//每一个线程都取数据
- parseLog(log);//打印"日志"信息
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- System.out.println("begin:"+(System.currentTimeMillis()/1000));
- for(int i=0;i<16;i++){ //这行代码不能改动
- final String log = ""+(i+1);//这行代码不能改动
- {
- try {
- queue.put(log);//往队列中放数据,放16条数据
- } 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();
- }
- }
- }
程序运行的结果:
可以看到,4线程在4秒内打印完原来需要16秒打印完的“日志”信息。
转载于:https://blog.51cto.com/020618/1187095