情景:有一个实现了Callable<String>的任务类Taske,在MainClass中定义了一个ArrayList<Taske> tList;MainClass中有一个固定大小的线程池ExecutorService pool,大小为5。有方法一直往tList中添加元素。
问题:希望能实现 让线程池中的线程都工作,如果一个线程完成了当前工作,又去取另一个任务,知道说有任务完成,关闭线程池。一个线程在执行一个任务时,希望任务的返回值中包含该线程的线程号!

解决方案 »

  1.   

    有方法一直往tList中添加元素。
    问题:希望能实现 让线程池中的线程都工作,如果一个线程完成了当前工作,又去取另一个任务知道说有任务完成,关闭线程池。一个线程在执行一个任务时,希望任务的返回值中包含该线程的线程号!线程池什么时候关闭掉?红色和绿色部分很矛盾!
      

  2.   

    你只需要不断的调用execute方法就可以了当线程不足的时候会等待其他线程完成当没有任务的时候直接调用shutdown就可以了,它会等待所有线程结束各自的任务后再关闭线程池,记得不是shutdownNow哦
      

  3.   

    至于返回执行任务的线程号,你只需在任务调用结束的时候调用Thread.currentThread(),然后取出你要的东西返回即可
      

  4.   

      public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(5);
        List<Task> tasks = new ArrayList<Task>(1000);
        for (int i = 0; i < 1000; i++) {
          tasks.add(new Task(i));
        }
        List<Future<String>> futureList = pool.invokeAll(tasks);
        for (Future<String> future : futureList) {
          System.out.println(future.get());
        }
        pool.shutdown();
      }  static class Task implements Callable<String> {    private final int taskId;    public Task(int taskId) {
          this.taskId = taskId;
        }    public String call() throws Exception {
          return taskId + " in " + Thread.currentThread().getName();
        }
      }
      

  5.   

    有方法一直往tList中添加元素。这句话没表达好,呵呵。想说的是tList中元素被取出后,有可能还会有别的加进来。但是最后一定会为空的!
      

  6.   

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class ThreadPoolTest {
    public static void main(String[] args) {
    ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);//两个线程
    int i = 1000;
    while(i-- > 0) {
    newFixedThreadPool.execute(new Runnable() {

    public void run() {
    System.out.println("线程ID:" + Thread.currentThread().getId());
    try {
    Thread.sleep(500);
    } catch (Exception e) {}
    }
    });
    }

    System.out.println("下面调用shutdown,如果还在打印’线程ID:xx‘表示线程还没执行完,shutdown调用后在等待");
    newFixedThreadPool.shutdown();
    }
    }
      

  7.   

    为什么用List啊,明显用Queue啊
      

  8.   

    引用 6 楼 hkp2008 的回复:有方法一直往tList中添加元素。这句话没表达好,呵呵。想说的是tList中元素被取出后,有可能还会有别的加进来。但是最后一定会为空的!那就更加有问题了。意思就是指队列中如果没有东西的话就结束掉线程池。如果队列已经为空,但是还没有马上被添加进来,如何知晓队列中是确实空了,还是处于空档期?
      

  9.   

    这个方法好像不行哦。下面是我的执行结果(一共有3个线程)
    pool-1-thread-1
    pool-1-thread-2
    pool-1-thread-3
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    pool-1-thread-2
    ....后面的都是线程2怎么线程2用得那么多次,其他两线程没怎么被用到?
      

  10.   

    主要是想学一下API中提供的线程池类,希望提供些实例!