使用列表时,Java中的多线程性能

时间:2014-07-11 23:00:04

标签: java multithreading


我是多线程概念的新手,我正在创建一个简单的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


无论如何,我可以调整代码,以便在使用多个线程时更快地运行???

提前谢谢

2 个答案:

答案 0 :(得分:2)

此示例无法从多个线程中受益,相反:您通过同步对列表的访问来增加开销,因此一次只有一个线程可以访问它。虽然这对于正确性是必要的,但实际操作的开销很低,以至于同步占主导地位。

如果您的工作线程使用列表中的数据执行了一些昂贵的计算或I / O,则此方案可能有意义。如果这是实际目标,则应将其包含在基准测试中。

答案 1 :(得分:0)

您已经遇到了所谓的关键路径,这部分代码必须正确排序,因此无法并行化。在此示例中,关键路径是您程序的大部分内容,因此您尝试使用多个线程无法获得任何收益。多线程只有在完成大量独立的工作(I / O,本地化计算)时才能提供优势。