当前位置:  开发笔记 > 编程语言 > 正文

如何使用固定数量的工作线程实现简单线程

如何解决《如何使用固定数量的工作线程实现简单线程》经验,为你挑选了3个好方法。

我正在寻找实现以下内容的最简单,最直接的方法:

主程序实例化工作线程以执行任务.

只能n同时运行任务.

n到达,没有更多的工人开始,直到运行的线程数降回到低于n.

erickson.. 56

我认为Executors.newFixedThreadPool符合您的要求.有许多不同的方法可以使用生成的ExecutorService,具体取决于您是希望返回主线程的结果,还是任务是完全自包含的,以及您是否有预先执行的任务集合,或者任务是否排队以响应某些事件.

  Collection tasks = new ArrayList();
  YourTask yt1 = new YourTask();
  ...
  tasks.add(yt1);
  ...
  ExecutorService exec = Executors.newFixedThreadPool(5);
  List> results = exec.invokeAll(tasks);

或者,如果要执行新的异步任务以响应某些事件,您可能只想使用ExecutorService的简单execute(Runnable)方法.



1> erickson..:

我认为Executors.newFixedThreadPool符合您的要求.有许多不同的方法可以使用生成的ExecutorService,具体取决于您是希望返回主线程的结果,还是任务是完全自包含的,以及您是否有预先执行的任务集合,或者任务是否排队以响应某些事件.

  Collection tasks = new ArrayList();
  YourTask yt1 = new YourTask();
  ...
  tasks.add(yt1);
  ...
  ExecutorService exec = Executors.newFixedThreadPool(5);
  List> results = exec.invokeAll(tasks);

或者,如果要执行新的异步任务以响应某些事件,您可能只想使用ExecutorService的简单execute(Runnable)方法.



2> Fabian Steeg..:
/* Get an executor service that will run a maximum of 5 threads at a time: */
ExecutorService exec = Executors.newFixedThreadPool(5);
/* For all the 100 tasks to be done altogether... */
for (int i = 0; i < 100; i++) {
    /* ...execute the task to run concurrently as a runnable: */
    exec.execute(new Runnable() {
        public void run() {
            /* do the work to be done in its own thread */
            System.out.println("Running in: " + Thread.currentThread());
        }
    });
}
/* Tell the executor that after these 100 steps above, we will be done: */
exec.shutdown();
try {
    /* The tasks are now running concurrently. We wait until all work is done, 
     * with a timeout of 50 seconds: */
    boolean b = exec.awaitTermination(50, TimeUnit.SECONDS);
    /* If the execution timed out, false is returned: */
    System.out.println("All done: " + b);
} catch (InterruptedException e) { e.printStackTrace(); }



3> Matt..:

Executors.newFixedThreadPool(INT)

Executor executor = Executors.newFixedThreadPool(n);

Runnable runnable = new Runnable() {
 public void run() {
  // do your thing here
 }
}

executor.execute(runnable);

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有