3

可能重复:
ThreadPool 和 JobQueue

  1. Manager 将作业指定到作业队列中(队列大小不固定)。
  2. 线程由固定数量的 ThreadPool 维护。
  3. 每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。
  4. 如果队列中没有作业,那么线程需要等待作业到达。(重复第 3 步和第 4 步)

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

4

3 回答 3

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;
                    }
                }
            }
        });
    }

解释:

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

声明一个阻塞队列来保存你的 Job。Stringtype 在这里代表 Job。

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

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

ExecutorServiceFixedThreadPool大小一起使用。

ExecutorService service = Executors.newFixedThreadPool(10);

每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。

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

queue.put("test"); 

使用take()阻塞的操作

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

参考:

于 2012-11-02T09:29:11.173 回答
1

我会使用 ExecutorService 对您的任务进行排队并管理您的线程池。

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

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

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

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

每当作业队列中有作业时,Frame 将 ThreadPool 中的线程分配给作业。

ExecutorService 将在线程空闲时将它们分配给线程。

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

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

于 2012-11-02T09:32:34.673 回答
0

如果您使用JDK 5 或更高版本,请使用 JDK 中的Executors 。您的作业是 Callable 接口的实现。ExecutorService 是执行器的外观。

于 2012-11-02T09:25:16.530 回答