我有一个程序,必须处理包含许多作业的列表。为了加快整个过程,我想实现Threads。
我想到这样的事情:
主要级
// I have a joblist with 100 entries
int iAmountThreads = 5;
for(Job oJob : joblist)
{
//only execute 5 Jobs at the same time
if(Thread.activeCount() < iAmountThreads)
{
Runnable threadJob = new JobRunnable(oJob);
Thread myThread = new Thread(threadJob);
myThread.start();
}
}
//wait here until all jobs from the joblist are finished
Runnable Class实现Runnable
public class JobRunnable implements Runnable
{
private Job oJob;
public JobRunnable(Job _oJob)
{
oJob = _oJob;
}
public void run()
{
//processing of the job
}
}
我正在寻找一种同时运行5个Jobs的方法,直到整个列表被处理完毕。当一个工作完成时 - &gt;下一个线程应该开始。
感谢您的帮助!
答案 0 :(得分:3)
通过执行程序API使用固定的线程池:
Executor executor = Executors.newFixedThreadPool(5);
// all jobs are submitted sequentially, but only 5 jobs execute concurrently at a time
for(Runnable job : jobs)
{
executor.execute(job);
}
答案 1 :(得分:1)
最简单的方法是使用Java 8并行流。一个简单的实现是:
List<JobRunnable> tasks = ...;
tasks.parallelStream()
forEach(JobRunnable::run);
这可以重新排列,您不需要使用Runnable
;你可以使用任何类的任何方法。但是,您必须小心线程安全,不要在列表中的对象之间保持共享状态。
答案 2 :(得分:0)
您应该使用Executors.newFixedThreadPool(5)