2012-11-02 121 views
3

可能重复:
ThreadPool and JobQueue队列线程池

  1. 经理指定的工作到工作队列(队列大小是不固定的)。
  2. 线程由固定数量的ThreadPool维护。
  3. 每当作业Queue中有作业时,Frame会将ThreadPool中的线程分配给作业。
  4. 如果队列中没有作业,那么线程需要等到作业到达。 (步骤3 &重复4次)

我该如何实现这些,如果可能的话还要提及代码。

+3

[BlockingQueue](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html)和[ExecutorService](http://docs.oracle.com/) javase/6/docs/api/java/util/concurrent/ExecutorService.html)就是你想要的。 –

+0

@AmitD - 我即将发布相同的内容。你应该把它作为答案。 –

+1

你已经问过同样的问题[这里](http://stackoverflow.com/questions/13179399/threadpool-and-jobqueue)。当问题已经被关闭时,请不要创建重复的问题,因为这不是真正的问题。请阅读API文档! –

回答

0

如果您使用的是JDK 5或更高版本,则可以从JDK使用Executors。你的工作是Callable接口的实现。 ExecutorService是执行者的外观。

4

你需要BlockingQueue排列你的任务和ExecutorService工人处理您的任务。

样本源代码:

final BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 
    queue.put("test");// Add item here 
    ExecutorService service = Executors.newFixedThreadPool(10);// specifynumber 
                   // of thread 
      int numWorkers = 10; 
    for (int i = 0; i < numWorkers; i++) { 
     service.submit(new Runnable() { 

      @Override 
      public void run() { 
       while (!Thread.currentThread().isInterrupted()) { 
        try { 
         String item = queue.take(); 
         // Process item 
        } catch (InterruptedException ex) { 
         Thread.currentThread().interrupt(); 
         break; 
        } 
       } 
      } 
     }); 
    } 

说明:

管理器指定作业分成作业队列(队列大小是不固定的)。

声明阻塞队列,它将保存您的作业。 String类型代表Job在这里。

final BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 

线程由固定数目的线程池的保持。

使用ExecutorServiceFixedThreadPool大小。

ExecutorService service = Executors.newFixedThreadPool(10); 

每当有在作业队列作业,从框架线程池分配线程的工作。

使用put操作提交作业以排队。

queue.put("test"); 

使用take()操作被阻塞

queue.take();//When there is job it will return the value else will get block 

参考文献:

+0

你可以稍微延伸一点细节 – user1791618

+0

@ user1791618检查更新 –

1

我会使用一个ExecutorService来排队你的任务和管理你的线程池。

管理器将作业指定到作业队列中(队列大小不固定)。

提交任务给的ExecutorService来处理每项工作,用submit(Runnable)

线程由固定数量的线程池的保持。

Executors.newFixedThreadPool(n_threads)是固定大小的线程池

每当有在作业队列中的作业,帧从线程池分配线程到作业。

ExecutorService会在线程变为空闲时将作业分配给线程。

如果队列中没有作业,那么线程需要等到作业到达。

没有任务的线程空闲,对资源影响很小。