使用Java线程从列表中处理作业

时间:2014-12-01 08:57:11

标签: java multithreading list

我有一个程序,必须处理包含许多作业的列表。为了加快整个过程,我想实现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;下一个线程应该开始。

感谢您的帮助!

3 个答案:

答案 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)