Java ThreadPoolExecutor 不创建新线程?

标签 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

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

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

谢谢!

最佳答案

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

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

关于Java ThreadPoolExecutor 不创建新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43869110/

相关文章:

java - 为什么我的 ThreadPool 没有在 Java 中并行运行?

java - 确定 Java ThreadPoolExecutor 中执行任务的优先级

java - 对于基于 I/O 的流,我应该在 flatMap 中使用 try-with-resource 吗?

java - 我尝试在 JButton 上使用 .getName,但它返回 null,但是当我执行 toString 时,它会返回所有正确的属性?

java - 两个 Spring 批处理工作重叠可以吗?

java.lang.InternalError 安卓

javascript - 访问 ionic 项目中自定义 cordova 插件的项目资源

java - 如何使用 spring boot 和 jpa 在数据库中上传和保存文件?

java - 执行器服务中的依赖线程 - Java