Java 添加更多线程会提高程序的性能吗

Java 添加更多线程会提高程序的性能吗,java,multithreading,performance,Java,Multithreading,Performance,在我的程序中,我有一个while循环,循环遍历一组图片的数组列表,并对它们进行一系列处理,以更改它们的外观和图像类型,然后将它们写入磁盘。我的问题是,添加多个线程来处理图像或保存图像会加快速度吗?如果会,那么最好的方法是什么。 ArrayList images=新的ArrayList()//超过500张图片 ArrayList路径=新的ArrayList(); int len=images.size() for(int i=0;i

在我的程序中,我有一个while循环,循环遍历一组图片的数组列表,并对它们进行一系列处理,以更改它们的外观和图像类型,然后将它们写入磁盘。我的问题是,添加多个线程来处理图像或保存图像会加快速度吗?如果会,那么最好的方法是什么。 ArrayList images=新的ArrayList()//超过500张图片 ArrayList路径=新的ArrayList(); int len=images.size()

for(int i=0;i
是的,很可能是因为:

1) 您的计算机可能有2到4个CPU或内核

2) 图像处理通常是CPU密集型的

3) 因此,大的CPU负载可以分为多个同时运行的任务

这会一直有效吗?

不可以。如果进程的i/o(internet、磁盘或内存)有限(例如,每个映像需要2G内存,或者必须写入大量临时文件),则不会看到线性速度的提高,因为CPU速度的提高将被i/o时间抵消,这会降低你的程序速度,不管你需要多少处理器来分担图像处理的负荷这就像做面条——煮面条需要10分钟。即使你有8个不同的烧嘴同时工作,面条吸水仍然需要10分钟,所以煮面条也无济于事。

Psuedo代码:

   //just a reminder ! 
   public static final int MAX_SEM=8;
   processAll()
   {
     //create a new semaphore with 4 slots.
     semaphore = new Semaphore(MAX_SEM) ;
     while(! images.empty())
         if(semaphore has a slot) 
           Image img=images.pop();
           sempahore.decrement()
           Thread().run( new Runable() { public void run() {process(img);} } 
         else
           Thread.sleep(1000);
    }

    process(Image i)
    {   do some work  on i 
        semaphore.increment()
    }

是的,很可能是因为:

1) 您的计算机可能有2到4个CPU或内核

2) 图像处理通常是CPU密集型的

3) 因此,大的CPU负载可以分为多个同时运行的任务

这会一直有效吗?

不可以。如果进程的i/o(internet、磁盘或内存)有限(例如,每个映像需要2G内存,或者必须写入大量临时文件),则不会看到线性速度的提高,因为CPU速度的提高将被i/o时间抵消,这会降低你的程序速度,不管你需要多少处理器来分担图像处理的负荷这就像做面条——煮面条需要10分钟。即使你有8个不同的烧嘴同时工作,面条吸水仍然需要10分钟,所以煮面条也无济于事。

Psuedo代码:

   //just a reminder ! 
   public static final int MAX_SEM=8;
   processAll()
   {
     //create a new semaphore with 4 slots.
     semaphore = new Semaphore(MAX_SEM) ;
     while(! images.empty())
         if(semaphore has a slot) 
           Image img=images.pop();
           sempahore.decrement()
           Thread().run( new Runable() { public void run() {process(img);} } 
         else
           Thread.sleep(1000);
    }

    process(Image i)
    {   do some work  on i 
        semaphore.increment()
    }

您可以将列表划分为n个块,这样就有大小为list/n的块,然后就可以有n个线程对这些图像“块”进行操作。这样,您就可以同时完成更多的工作


为了解决一些问题,它很可能会增加I/O并发性,因为在单线程运行中,它会在第一次未命中和阻塞时出错,然后在读取第二个映像时再次出错,等等。。。以多线程方式,它将一次阻塞n个映像,这允许I/O调度程序一次处理更多的I/O(这通常是一件好事)。这意味着即使在单核处理器中,由于I/O重叠,以及在I/O线程阻塞等待时,更多线程可在内核上运行,因此性能也会提高。

您可以将列表划分为n个块,这样就有大小为list/n的块,然后就可以有n个线程在这些“块”上运行一系列的图像。这样,您就可以同时完成更多的工作


为了解决一些问题,它很可能会增加I/O并发性,因为在单线程运行中,它会在第一次未命中和阻塞时出错,然后在读取第二个映像时再次出错,等等。。。以多线程方式,它将一次阻塞n个映像,这允许I/O调度程序一次处理更多的I/O(这通常是一件好事)。这意味着即使在单核处理器中,由于I/O重叠,以及在I/O线程阻塞等待时,更多线程可在内核上运行,因此性能也会提高。

如果我说添加了40个不同的线程,会怎么样?如果您有40个核/处理器,那么就这样做。只要确保第一个比最后一个优先级高,所以你的硬盘不能整天工作,没有线程得到他们想要的。k只是尝试了类似的东西,但似乎我真的不能为evrey single iamge创建线程,或者它变得超级滞后。我想我会尝试,只做4个maxdon’如果你这样做,结果将是不可预测的。特别是如果这些是内存密集型的。从2开始-如果这使性能加倍,则转到4,然后尝试8。除非你知道你的cpu、内存限制和线程,否则我不会做超过8个。如果我说添加40个不同的线程呢?如果你有40个内核/处理器,那么就做吧。只要确保第一个比最后一个优先级高,所以你的硬盘不能整天工作,没有线程得到他们想要的。k只是尝试了类似的东西,但似乎我真的不能为evrey single iamge创建线程,或者它变得超级滞后。我想我会尝试,只做4个maxdon’如果你这样做,结果将是不可预测的。特别是如果这些是内存密集型的。从2开始-如果这使性能加倍,则转到4,然后尝试8。除非您了解您的cpu、内存限制和线程的总体情况,否则我不会做超过8的事情。您正在尝试改进的代码示例将增加社区提供帮助的几率。:)根据您的描述,可能是磁盘I/O,在这种情况下,多线程可能没有帮助。您是否尝试分析应用程序以确定性能瓶颈在哪里