2017-05-09 28 views
0

私は2つの整数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);  
    }  
} 

- >

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 

私の問題は、次のとおりです。私は、出力、スレッドをしたいと順番にカウントされます。このよう - >

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

すべてを同期的に実行するには、スレッドプールの目的が明確ではありません。あなたの道を並行して走らせることはできません。 –

+1

これは並行処理の仕組みではありません – MadProgrammer

+1

逐次実行が必要なときにスレッドを使用する理由を私が決して理解できないことはありません。 – EJP

答えて

1

あなたのWorkerThreadオブジェクトは、スレッドプール内の異なるスレッドで実行されます。スレッドは独立して実行されるため、作業者の作業がより速く実行され、実行が遅くなることがあります。それで、数字が順番に出てこない理由です。

数値を順番に並べ替えるのが最も簡単な方法は、スレッドプールを使用するのではなく、メインスレッドですべてを実行することです。また、固定スレッドプールを持つExecutorServiceを、その中にスレッドが1つだけ作成することもできます。

1

だからあなたはあなたがyが順番にない減らさなっている問題を抱えています。

理由は非常に単純です。最初に開始するスレッドが最初に終了するはずです。しかし、スレッド実行では、このようなものはは保証されていませんです。

すべてはスレッドごとにリソースに割り当てられる方法によって異なります。もし、すべての必要なものをあなたの要件ごとに

は、を平行でなく、逐次プログラムです。スレッドを持つ並列プログラムは、あなたのケースでは完全に無関係です。

これが役に立ちます。 :))

+0

スレッドプールの有無にかかわらずどのように行うかを教えてください。サンプルプログラムのリンクまたは何か。 –

+0

@ Mahela.Prasadデクリメントを見たい場合は、1000から0へのforループを実行してください。 –

+0

@ Supun.Wijerathne私はそれに対してx個のスレッドを使いたいです。私はスレッドプールがそれに良いと思った。私はそれなしでやる方法を知らない。 –