Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能做出一个慢的回答;for loop";多线程更快?_Java_Multithreading_For Loop - Fatal编程技术网

Java 我怎样才能做出一个慢的回答;for loop";多线程更快?

Java 我怎样才能做出一个慢的回答;for loop";多线程更快?,java,multithreading,for-loop,Java,Multithreading,For Loop,假设我有一个非常慢的大的for循环 如何将其拆分为多个线程,使其运行更快 for (int a = 0; a < 30_000_000; a++) { for (int b = 0; b < 30_000_000; b++) { for (int c = 0; c < 30_000_000; c++) { slowMethod(); } } } for(int a=0;a

假设我有一个非常慢的大的for循环

如何将其拆分为多个线程,使其运行更快

for (int a = 0; a < 30_000_000; a++) {
    for (int b = 0; b < 30_000_000; b++) {
        for (int c = 0; c < 30_000_000; c++) {
           slowMethod();
        }
    }
}
for(int a=0;a<30\u 000\u 000;a++){
对于(int b=0;b<30_000;b++){
对于(int c=0;c<30_000;c++){
慢方法();
}
}
}

这有点宽泛,但是当处理器编号大于1且
slowMethod
独立时,使用具有固定线程编号的
ExecutorService
将使其速度更快。如果
slowMethod
是I/O密集型方法,则可以增加线程数以获得更高的性能

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(
                   Runtime.getRuntime().availableProcessors() + 1);

        for (int a = 0; a < 30000000; a++) {
            for (int b = 0; b < 30000000; b++) {
                for (int c = 0; c < 30000000; c++) {
                    final int a_copy = a;
                    final int b_copy = b;
                    final int c_copy = c;
                    service.execute(() -> {
                            slowMethod(a_copy, b_copy, c_copy);
                    });
                }
            }
        }
    }

    public static void slowMethod(int a, int b, int c) {

    }
}

这个问题没有一般性的答案
slowMethod()
必须正确设计,这样才能利用并行性,否则就看不到速度的提高。循环结构本身并不慢。由于您不使用
a,b,c
,因此您还可以使用一个从
0
Math.pow(30,3)
的单循环。慢的部分是
slowMethod
,它按顺序运行的事实是阻塞。您只需确保将其发布到自己的线程中,例如使用
ExecutorService
。显然,该方法必须以线程安全的方式设计,才能工作。也可能有更好的方法,比如fork&join,但这取决于该方法到底在做什么。这正是我想要的!使用无界队列的伟大回答。向队列中添加3e7*3e7*3e7=2.7e28项不是一个好主意(溢出)。
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
int threads = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = new ThreadPoolExecutor(threads, threads,
        0, TimeUnit.MILLISECONDS,
        queue, Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.CallerRunsPolicy());