线程池按顺序

时间:2017-05-09 01:06:02

标签: java multithreading threadpool

我有两个整数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

2 个答案:

答案 0 :(得分:1)

您的WorkerThread对象由线程池中的不同线程运行。线程独立运行,因此有些可能会更快地运行一个worker,而另一些则更慢。这就是为什么这些数字没有按顺序出现的原因。

如果您希望数字按顺序排列,最简单的方法就是在主线程中运行它们,而不是使用线程池。或者,您可以创建一个具有固定线程池的ExecutorService,其中只包含一个线程。

答案 1 :(得分:1)

因此,您遇到的问题是 按顺序 减少<{1>}

原因很直接。您希望首先开始的线程应该首先完成。但是在线程执行中,这样的事情 无法保证

这完全取决于每个线程如何为资源分配。

根据您的要求,您需要的是 顺序程序,而不是并行 。带有线程的并行程序在您的情况下完全不相关。

希望这会有所帮助。 :))