我想使用不同的线程从共享的整数列表中删除值。为此,我决定使用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
看起来我的工作没有被两个线程执行。它始终是相同的线程。 我需要使用两个线程遍历整数值列表。
我做错了什么?有什么我看不到的吗?
谢谢!
答案 0 :(得分:3)
1.错误为this.getName()
,请使用Thread.currentThread().getName()
;
2.你已经初始化了一个有两个线程的线程池,但你只有一个工作,那么线程池只会提供一个线程来执行你的工作;
答案 1 :(得分:0)
以这种方式尝试,但测试用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())));
}