我是多线程概念的新手,我正在创建一个简单的Java程序来体验多线程和东西
在我的程序中,我只是有一个链表,我创建了一个线程,只是从头开始删除列表项。我实现了 Runnable 接口,这就是我的线程的 run 方法:(我在构造函数中设置 list )
public void run() {
System.out.println("Starting...");
while (!list.isEmpty()) {
synchronized (list) {
list.removeFirst();
}
}
System.out.println("Finished!");
}
在 main 方法中,我将大量项目添加到链接列表(10,000,000)并简单地创建此类的实例以同时运行并测量时间:
Thread my1 = new Thread(new MyThread("my1", list));
Thread my2 = new Thread(new MyThread("my2", list));
Thread my3 = new Thread(new MyThread("my3", list));
startTime = System.currentTimeMillis();
my1.start();
my2.start();
my3.start();
my1.join();
my2.join();
my3.join();
endTime = System.currentTimeMillis();
elapsedTime = endTime - startTime;
System.out.println("Main finished in " + elapsedTime + " milliseconds.");
有趣的是,当我使用这3个线程运行我的程序时,我收到消息:
Main finished in 444 milliseconds
但是,当我只使用一个线程时,我会收到消息:
Main finished in 223 milliseconds
无论如何,我可以调整代码,以便在使用多个线程时更快地运行???
提前谢谢
答案 0 :(得分:2)
此示例无法从多个线程中受益,相反:您通过同步对列表的访问来增加开销,因此一次只有一个线程可以访问它。虽然这对于正确性是必要的,但实际操作的开销很低,以至于同步占主导地位。
如果您的工作线程使用列表中的数据执行了一些昂贵的计算或I / O,则此方案可能有意义。如果这是实际目标,则应将其包含在基准测试中。
答案 1 :(得分:0)
您已经遇到了所谓的关键路径,这部分代码必须正确排序,因此无法并行化。在此示例中,关键路径是您程序的大部分内容,因此您尝试使用多个线程无法获得任何收益。多线程只有在完成大量独立的工作(I / O,本地化计算)时才能提供优势。