/**
* 第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,
* 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,
* 程序只需要运行4秒即可打印完这些日志对象。
*/
public class InterviewDemo01 {
public static void main(String[] args){
final BlockingQueue<String> bq = new ArrayBlockingQueue<String>(4);
for(int i=0;i<4;i++){
Thread th = new Thread(new Runnable(){
public void run(){
while(true){ //为什么要加一个循环才能打印出十六条数据???? 求解释???
try {
String str=bq.take();
parseLog(str);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("33"); //为什么这段代码放在while后面编译不能通过,而放在while前面能通过???
}
},"ok-->"+i);
th.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 {
bq.put(log);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//parseLog方法内部的代码不能改动
public static void parseLog(String log){
System.out.println(log+":"+Thread.currentThread().getName()+" "+(System.currentTimeMillis()/1000));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
|
|