【发布时间】: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) 一次。它现在正在工作