Java ThreadPoolExecutor没有创建新线程?

时间:2017-05-09 11:53:30

标签: java threadpoolexecutor

我想使用不同的线程从共享的整数列表中删除值。为此,我决定使用ThreadPoolExecutor服务。

首先,我创建了一个BlockingQueue来存储100万个值。

 BlockingQueue q = new LinkedBlockingQueue<Integer>();
    for (int i=0;i<100000;i++)
        q.add(i);

其次,我的ThreadPoolExecutor

 ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
 MyExecutorJob job = new MyExecutorJob(q);
 executor.execute(job);

工作班的主体是:

public class MyExecutorJob extends Thread
{
   private BlockingQueue<Integer> queue;

   public MyExecutorJob(BlockingQueue<Integer> queue)
   {
    this.queue = queue;
   }

   @Override
   public void run()
   {
       try
       {
           while (!queue.isEmpty())
           {
               Integer x = (Integer) queue.take();
               System.out.println(x + " - " + this.getName());
           }
       }
       catch (Exception ex)
       {
       }

   }
}

结果总是

1 - Thread-0 
2 - Thread-0 
3 - Thread-0 
4 - Thread-0 
....
100000 - Thread-0

看起来我的工作没有被两个线程执行。它始终是相同的线程。 我需要使用两个线程遍历整数值列表。

我做错了什么?有什么我看不到的吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

1.错误为this.getName(),请使用Thread.currentThread().getName();

2.你已经初始化了一个有两个线程的线程池,但你只有一个工作,那么线程池只会提供一个线程来执行你的工作;

答案 1 :(得分:0)

以这种方式尝试,但测试用100000替换100

public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(2);
    IntStream.range(0, 100000).forEach(i ->
        executor.execute(() -> System.out.println(i + " - " + currentThread().getName())));
}