----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
今天学习了张老师讲解的三道空中网面试题。
第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象。原始代码如下:
package read;
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();
}
}
}
分析:要求4秒内打印完16个对象,那么4个线程每个线程一秒打印一个对象,打印的对象又从哪里获取呢?把数据存在一个队列里,用新学习的阻塞队列ArrayBlockingQueue,初始大小定为16,每个线程取数据的时候就从这个队列里面取。这里队列的大小也可以设置为1,因为打印对象需要消耗一秒的时间,而存入数据很快,存入数据会发生阻塞,读取数据不会发生阻塞,能保证每个线程每秒打印一个对象。