java - Java 中处理列表时的多线程性能

标签 java multithreading


我是多线程概念的新手,我正在创建一个简单的 Java 程序来体验多线程和其他内容。
在我的程序中,我只有一个链接列表,然后创建一个线程来从头开始删除列表项。我实现了 Runnable 接口(interface),这就是我的线程的 run 方法的样子:(我在构造函数中设置了 list)

public void run() {
    System.out.println("Starting...");

    while (!list.isEmpty()) {
        synchronized (list) {
            list.removeFirst();             
        }
    }

    System.out.println("Finished!");
}


ma​​in 方法中,我向链接列表添加了大量项目(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


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

提前谢谢

最佳答案

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

如果您的工作线程对列表中的数据进行了一些昂贵的计算或 I/O,则这种情况可能有意义。如果这是实际目标,您应该将其包含在基准中。

关于java - Java 中处理列表时的多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707848/

相关文章:

java - Spring Integration Java DSL -- 聚合器的配置

java - Maven:调用外部父pom

java - 需要有关 Java Vector/ConcurrentModificationException 同步的建议

java - .NET 的 WebClient 和 Java 中的 HttpWebRequest 是否等效?

python - 如何生成一个计数器来查找具有 9 个前导零的哈希值

java - 找出所有的哈密顿循环

c# - 在 C# 中安全回显 MIDI 数据

c# - 不确定如何在线程之间传递对象

c# - 循环内的异步/等待会造成瓶颈吗?

c# - 控制 Windows 窗体中多个线程之间的同步