当前位置: 首页 > 知识库问答 >
问题:

多线程比单线程快吗?

袁鸿畴
2023-03-14

我想检查多线程是否比单线程快,然后我在这里做一个演示:

public class ThreadSpeedTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("cpu number:"
                + Runtime.getRuntime().availableProcessors());
        singleThreadStart();
//      secondThreadStart();
//      fiveThreadStart();
    }

    private static void sum() {
        long sum = 0;
        for (int i = 0; i < 1000000; i++) {
            sum += i;
        }
        System.out.println(sum);
    }

    private static void singleThreadStart() {
        new Thread(new Runnable() {

            public void run() {
                long start = System.nanoTime();
    //          sum();
    //          sum();
    //          sum();
                sum();
                sum();
                long end = System.nanoTime();
                System.out.println("cost time:" + (end - start));
            }
        }).start();
    }

    private static void secondThreadStart() {
        long start = System.nanoTime();
        Thread thread1 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.nanoTime();
        System.out.println("cost time:" + (end - start));
    }

    private static void fiveThreadStart() {
        long start = System.nanoTime();
        Thread thread1 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread1.start();
        Thread thread2 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread2.start();
        Thread thread3 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread3.start();
        Thread thread4 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread4.start();
        Thread thread5 = new Thread(new Runnable() {

            public void run() {
                sum();
            }
        });
        thread5.start();

        try {
            thread1.join();
            thread2.join();
            thread3.join();
            thread4.join();
            thread5.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.nanoTime();
        System.out.println("cost time:" + (end - start));
    }
}

首先,我用二和方法运行singleThreadStart,结果是

cpu number:4
499999500000
499999500000
cost time:6719000

然后我运行第二个ThreadStart,结果是

cpu number:4
499999500000
499999500000
cost time:14299000

然后我用五和方法运行singleThreadStart,结果是

cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:10416000

最后我运行fiveThreadStart,结果是

cpu number:4
499999500000
499999500000
499999500000
499999500000
499999500000
cost time:15708000

我的问题是:

  1. SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的成本吗

共有2个答案

骆雅昶
2023-03-14
  1. 创建额外的线程绝对是有成本的。在启动新线程之前,您应该有大量的工作需要。
  2. 我假设这意味着您有一个四核CPU。最佳线程数实际上取决于工作负载,如果线程出于任何原因正在等待,它们可能能够上下文切换到另一个线程,并且您可能会看到线程数大于物理内核数的好处。
  3. 我不明白这个问题。
东方海
2023-03-14

1.SecondThreadStart比singleThreadStart花费更多时间,是因为创建线程的成本吗?

当然,创建线程会有开销。

2.cpu数量是4,尽管创建线程的成本很高,但是使用4个以上的线程会比使用4个线程慢吗?

如果线程完成得非常快(不是IO绑定和CPU绑定),即使线程数多于CPU内核数,您也可以获得良好的结果。

3.如果我想做某事花费很多时间,最好使用四个线程来做?

您可以使用高级java并发类(newWorkStealingPool,属于执行器)

请参阅以下问题:

Java's Fork/Join vs ExecutorService-何时使用哪个?

一般来说:

多线程可以通过使用更多的CPU功率来提高应用程序的吞吐量。

这取决于很多因素。

  1. 线程数
  2. CPU内核
  3. 线程创建成本和上下文切换(可能对多线程有效)
  4. 数据结构
  5. 数据的可变性(可能对多线程起作用)
  6. 数据结构的共享访问/并发性(可能不适用于多线程)
  7. 应用程序类型:CPU绑定或IO绑定

如果您的应用程序

>

  • 更少的CPU绑定,更少的IO绑定(但仍然可以将多线程用于这些应用程序)

    没有共享数据

    如果不是,性能取决于上述因素,吞吐量在单线程应用程序和多线程应用程序之间会有所不同。

    一些好的SE问题:

    https://softwareengineering.stackexchange.com/questions/97615/what-can-multiple-threads-do-that-a-single-thread-cannot

    多线程总是比单线程产生更好的性能吗?

    为什么在Java中单线程比多线程快?

    好文章:

    thetechsolo.wordpress.com文章

    java性能文章

  •  类似资料:
    • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

    • 问题内容: 以下程序与此处描述的程序基本相同。当我使用两个线程(NTHREADS== 2)运行并编译程序时,得到以下运行时间: 当仅使用一个线程(NTHREADS == 1)运行时,即使仅使用一个内核,运行时间也会明显缩短。 我的系统是双核的,我知道random_r是线程安全的,并且我很确定它是非阻塞的。如果在没有random_r的情况下运行同一程序,并且使用余弦和正弦值的计算作为替换,则双线程版

    • 为什么单线程和多线程脚本具有相同的处理时间?多线程实现不是应该少1/#线程数吗?(我知道当您达到最大cpu线程时,回报会递减) 我搞砸了我的实现吗?

    • 本文向大家介绍Python中单线程、多线程和多进程的效率对比实验实例,包括了Python中单线程、多线程和多进程的效率对比实验实例的使用技巧和注意事项,需要的朋友参考一下 python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优

    • 问题内容: Scrapy中很少有并发设置,例如CONCURRENT_REQUESTS。这意味着Scrapy搜寻器是多线程的吗?因此,如果我运行它,将在字面上并行触发多个同时请求?我问是因为,我读过Scrapy是单线程的。 问题答案: Scrapy是单线程的,除了交互式外壳程序和一些测试之外,请参见source。 它建立在Twisted的基础上,Twisted也是单线程的,并且利用了它自己的异步并发

    • 问题内容: 我想看看使用多线程生产者而不是单线程生产者会有多少时间差异。我在本地计算机上设置了ActiveMQ,编写了生产者类,该类将初始化并在其构造函数中启动JMS连接。我将消息限制设置为3M,将所有消息推送到ActiveMQ大约花费了50秒。我只发送了一个字符串“ hello world” 3M次。 然后,我使用了相同的生产者对象(一个连接但有多个会话),并使用线程大小为8的ExecutorS