Java ThreadPoolExecutor不创建新线程?

Java ThreadPoolExecutor不创建新线程?,java,threadpoolexecutor,Java,Threadpoolexecutor,我想使用不同的线程从共享的整数列表中删除值。为此,我决定使用ThreadPoolExecutor服务 首先,我创建了一个BlockingQueue来存储一百万个值 BlockingQueue q = new LinkedBlockingQueue<Integer>(); for (int i=0;i<100000;i++) q.add(i); 作业类的主体如下所示: public class MyExecutorJob extends Thread

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

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

 BlockingQueue q = new LinkedBlockingQueue<Integer>();
    for (int i=0;i<100000;i++)
        q.add(i);
作业类的主体如下所示:

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.错误是
this.getName()
,请使用
Thread.currentThread().getName()


2.您已经初始化了一个线程池,该线程池有两个线程,但是您只有一个作业,那么该线程池将只提供一个线程来执行您的作业

尝试这种方法,但对于测试,请将
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())));
}

您是否确实提交了多个作业实例?您只向
线程池执行器提交了一个作业。该作业只传递给一个线程。尝试调用
executor.execute(作业)第二次。还要注意,
this.getName()
与执行此代码的线程的名称完全无关。为此,请使用
Thread.currentThread().getName()
。它将类似于
pool-0-thread-0
。您不应该让作业类扩展线程。改为实现Runnable或Callable。否则你们只会把自己弄糊涂。谢谢你们。我想我需要给执行人打个电话。只执行一次。它正在工作
1 - Thread-0 
2 - Thread-0 
3 - Thread-0 
4 - Thread-0 
....
100000 - Thread-0
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())));
}