Jos*_*son 5 java multithreading
我有一个java程序,它的一部分是计算密集型的,就像这样
for i = 1 :512
COMPUTE INTENSIVE SECTION
end
Run Code Online (Sandbox Code Playgroud)
我想将它拆分为多线程,在运行时加快速度.
COMPUTE INTENSIVE SECTION不是顺序的.这意味着首先运行i = 1或者i = 5拳头是相同的......
任何人都可以给我一个关于此的大指南.怎么做?谢谢!感恩节快乐!
你应该阅读并发径的的Java教程.特别是执行程序和线程池应该与您相关.
基本上,你创建一个线程池(这是Executor)通过在工厂方法的Executors类,并提交Runnable实例吧:
for(int i = 0; i < 512; i++){
executor.execute(new Runnable(){public void run(){
// your heavy code goes here
}});
}
Run Code Online (Sandbox Code Playgroud)
听起来线程池会很好。基本上,您创建 N 个不同线程的集合,然后在循环中请求它们。该请求将被阻塞,直到有线程可用为止。
ThreadPool pool = Executors.newFixedThreadPool(10); // 10 threads in the pool
ArrayList<Callable> collectionOfCallables = new ArrayList<Callable>( );
for (...) {
Callable callable = new Callable<Foo>() { public Foo call() { COMPUTE INTENSIVE SECTION } }
collectionOfCallables.add(callable);
}
ArrayList<Future<Foo>> results = pool.invokeAll( collectionOfCallables );
pool.awaitTermination(5, TimeUnit.MINUTES ); // blocks till everything is done or 5 minutes have passed.
Run Code Online (Sandbox Code Playgroud)
有了 Future,你真的不需要等待终止。get() 来自 future 的结果将阻塞,直到相应的线程完成(或取消)。