我想从使用不同线程的整数共享列表中删除值。为此,我决定使用 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/