【问题标题】:Java ThreadPoolExecutor not creating new threads?Java ThreadPoolExecutor 没有创建新线程?
【发布时间】:2017-10-07 17:21:09
【问题描述】:

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

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

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

第二,我的线程池执行器

 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

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

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

谢谢!

【问题讨论】:

  • 您实际上是否submit 不止一个工作实例?
  • 您只向ThreadPoolExecutor 提交了一份工作。该作业被传递给一个线程。尝试再次拨打executor.execute(job);
  • 还要注意this.getName() 与执行此代码的线程的名称完全无关。为此使用Thread.currentThread().getName()。类似于pool-0-thread-0。你不应该让你的工作类扩展线程。改为实现 Runnable 或 Callable。否则你只会让自己感到困惑。
  • 谢谢大家。我以为我只需要调用 executor.execute(job) 一次。它现在正在工作

标签: java threadpoolexecutor


【解决方案1】:

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

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

【讨论】:

    【解决方案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())));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多