How to implement simple threading with a fixed number of worker threads

I'm looking for the simplest, most straightforward way to implement the following:

  • The main program instantiates worker threads to do a task.
  • Only n tasks can be running at once.
  • When n is reached, no more workers are started until the count of running threads drops back below n .

  • I think that Executors.newFixedThreadPool fits your requirements. There are a number of different ways to use the resulting ExecutorService, depending on whether you want a result returned to the main thread, or whether the task is totally self-contained, and whether you have a collection of tasks to perform up front, or whether tasks are queued in response to some event.

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

    Alternatively, if you have a new asynchronous task to perform in response to some event, you probably just want to use the ExecutorService's simple execute(Runnable) method.


    /* 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(); }
    

    Executors.newFixedThreadPool(INT)

    Executor executor = Executors.newFixedThreadPool(n);
    
    Runnable runnable = new Runnable() {
     public void run() {
      // do your thing here
     }
    }
    
    executor.execute(runnable);
    
    链接地址: http://www.djcxy.com/p/16380.html

    上一篇: Java中Runnable和Callable接口的区别

    下一篇: 如何用固定数量的工作线程实现简单的线程