练习题1
现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,
请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,
程序只需要运行4秒即可打印完这些日志对象。
解决方案:将主线程中产生的数据存入到阻塞队列中,启动的四个消费者线程一次去队列中取数据。
题目代码示例:
/*
现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,
请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,
程序只需要运行4秒即可打印完这些日志对象。
*/
public class Test1 {
public static void main(String[] args) {
System.out.println("begin"+System.currentTimeMillis()/1000);
for (int i = 0; i < 16; i++) {
String log=""+(i+1);
{
Test1.parseLog(log); //关键点是在此处理
}
}
}
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个线程去调用parseLog()方法来分头打印这16个日志对象,
程序只需要运行4秒即可打印完这些日志对象。
解决方案:将主线程中产生的数据存入到阻塞队列中,启动的四个消费者线程一次去队列中取数据。
*/
public class Test1_1 {
public static void main(String[] args) {
System.out.println("begin"+System.currentTimeMillis()/1000);
final BlockingQueue<String> blockingQueue=new ArrayBlockingQueue<String>(16);
for (int i = 0; i < 4; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
String data = blockingQueue.take();
parseLog(data);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
for (int i = 0; i < 16; i++) {
String log=""+(i+1);
{
try {
blockingQueue.put(log);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Test1_1.parseLog(log); //关键点是在此处理
}
}
}
public static void parseLog(String log){
System.out.println(log+":"+System.currentTimeMillis()/1000);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}