首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >队列ThreadPool

队列ThreadPool
EN

Stack Overflow用户
提问于 2012-11-02 09:22:27
回答 3查看 2.7K关注 0票数 3

可能重复: ThreadPool和JobQueue

  1. 管理器指定作业队列中的作业(队列大小不固定)。
  2. 线程由固定数量的ThreadPool维护。
  3. 每当作业队列中有作业时,框架将线程从ThreadPool分配给作业。
  4. 如果队列中没有作业,则线程需要等待作业到达。(步骤3及4重复)

如果可能的话,我可以如何实现这些代码。

EN

回答 3

Stack Overflow用户

发布于 2012-11-02 09:29:11

您需要BlockingQueue为您的任务排队,ExecutorService需要工作人员来处理您的任务。

示例源代码:

代码语言:javascript
复制
    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类型在这里表示作业。

代码语言:javascript
复制
final BlockingQueue<String> queue = new LinkedBlockingQueue<String>();

线程由固定数量的ThreadPool维护。

使用ExecutorServiceFixedThreadPool大小。

代码语言:javascript
复制
ExecutorService service = Executors.newFixedThreadPool(10);

每当作业队列中有作业时,框架将线程从ThreadPool分配给作业。

使用put操作将作业提交到队列。

代码语言:javascript
复制
queue.put("test"); 

使用阻塞的take()操作

代码语言:javascript
复制
queue.take();//When there is job it will return the value else will get block

参考文献:

  • BlockingQueue
  • ExecutorService
票数 4
EN

Stack Overflow用户

发布于 2012-11-02 09:32:34

我将使用ExecutorService来对任务进行排队,并管理线程池。

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

使用ExecutorService向submit(Runnable)提交任务以处理每个作业

线程由固定数量的ThreadPool维护。

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

每当作业队列中有作业时,框架将线程从ThreadPool分配给作业。

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

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

没有任务的线程是空闲的,对资源几乎没有影响。

票数 1
EN

Stack Overflow用户

发布于 2012-11-02 09:25:16

如果您正在使用JDK 5或更高版本,请使用来自JDK的遗嘱执行人。您的作业是可调用接口的实现。ExecutorService是执行者的正面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13192453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档