- 经理指定的工作到工作队列(队列大小是不固定的)。
- 线程由固定数量的ThreadPool维护。
- 每当作业Queue中有作业时,Frame会将ThreadPool中的线程分配给作业。
- 如果队列中没有作业,那么线程需要等到作业到达。 (步骤3 &重复4次)
我该如何实现这些,如果可能的话还要提及代码。
我该如何实现这些,如果可能的话还要提及代码。
如果您使用的是JDK 5或更高版本,则可以从JDK使用Executors。你的工作是Callable接口的实现。 ExecutorService是执行者的外观。
你需要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>();
线程由固定数目的线程池的保持。
使用ExecutorService
与FixedThreadPool
大小。
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
参考文献:
你可以稍微延伸一点细节 – user1791618
@ user1791618检查更新 –
我会使用一个ExecutorService来排队你的任务和管理你的线程池。
管理器将作业指定到作业队列中(队列大小不固定)。
提交任务给的ExecutorService来处理每项工作,用submit(Runnable)
线程由固定数量的线程池的保持。
甲Executors.newFixedThreadPool(n_threads)
是固定大小的线程池
每当有在作业队列中的作业,帧从线程池分配线程到作业。
ExecutorService会在线程变为空闲时将作业分配给线程。
如果队列中没有作业,那么线程需要等到作业到达。
没有任务的线程空闲,对资源影响很小。
[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)就是你想要的。 –
@AmitD - 我即将发布相同的内容。你应该把它作为答案。 –
你已经问过同样的问题[这里](http://stackoverflow.com/questions/13179399/threadpool-and-jobqueue)。当问题已经被关闭时,请不要创建重复的问题,因为这不是真正的问题。请阅读API文档! –