我有两个整数x和y。 x是线程池中的线程数。 y是我想要运行线程的次数。我不想使用sleep()。
public class TestThreadPool {
public static void main(String[] args) {
int x = 7;
int y = 1000;
ExecutorService executor = Executors.newFixedThreadPool(x);//creating a pool of 7 threads
for (int i = 0; i < y; i++) {
Runnable worker = new WorkerThread("" + (y-i));
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) { }
System.out.println("Finished all threads");
}
}
class WorkerThread implements Runnable {
private String message;
public WorkerThread(String s){
this.message=s;
}
public void run() {
System.out.println(Thread.currentThread().getName()+" count = " + message);
}
}
当我运行时,我得到了这个 - &gt;
pool-1-thread-1 count = 1000
pool-1-thread-3 count = 998
pool-1-thread-2 count = 999
pool-1-thread-4 count = 997
.
.
.
.
pool-1-thread-2 count = 2
pool-1-thread-15 count = 1
pool-1-thread-14 count = 7
pool-1-thread-4 count = 8
pool-1-thread-3 count = 9
Finished all threads
我的问题是:我想要输出,线程和计数。 像这样 - &gt;
pool-1-thread-1 count = 1000
pool-1-thread-2 count = 999
pool-1-thread-3 count = 998
pool-1-thread-4 count = 997
pool-1-thread-5 count = 996
pool-1-thread-6 count = 995
pool-1-thread-7 count = 994
pool-1-thread-1 count = 993
pool-1-thread-2 count = 992
.
.
pool-1-thread-5 count = 2
pool-1-thread-6 count = 1
Finished all threads
答案 0 :(得分:1)
您的WorkerThread对象由线程池中的不同线程运行。线程独立运行,因此有些可能会更快地运行一个worker,而另一些则更慢。这就是为什么这些数字没有按顺序出现的原因。
如果您希望数字按顺序排列,最简单的方法就是在主线程中运行它们,而不是使用线程池。或者,您可以创建一个具有固定线程池的ExecutorService,其中只包含一个线程。
答案 1 :(得分:1)
因此,您遇到的问题是 不 按顺序 减少<{1>} 。
原因很直接。您希望首先开始的线程应该首先完成。但是在线程执行中,这样的事情 无法保证 。
这完全取决于每个线程如何为资源分配。
根据您的要求,您需要的是 顺序程序,而不是并行 。带有线程的并行程序在您的情况下完全不相关。
希望这会有所帮助。 :))