0

スレッドが終了して新しいスレッドを開始することを理解するスレッドを書きたいです。私はこのコードを書いたことを意味します:

 new Thread(new Runnable(){ 
            @Override public void run(){
    //code here
                } 
           }).start();

しかし、私はそれをforループでやりたいです。スレッドを 5 つだけ作成したいのですが、スレッドが終了したら、新しいスレッドを作成したいと思います。

for(int i=0;i<300;i++)
{
 //I want to create 5 thread here and stop code  and then when a thread has finished I want //to create  new thread.
}
4

3 に答える 3

5

スレッド クラスには次のメソッドがあり、必要なことを行うために使用できます。

Thread.join()
Thread.isAlive()

しかし、おそらく次のように、スレッド プールを実際に使用する必要があります。

    ExecutorService executor = Executors.newFixedThreadPool(5);
    for(int i=0;i<N;i++) {
        executor.submit(new Runnable() {
            @Override
            public void run() {
            }
        });
    }
于 2013-06-25T12:23:44.590 に答える
1

より普遍的な方法が必要であるが、より低レベルの方法が必要な場合は、セマフォを使用できます。

final Semaphore s = new Semaphore(5);
for (int i = 0; i < 20; ++i)
{
    final int j = i;

    s.acquire();

    new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            try
            {
                System.out.println("Thread " + j + " starts.");
                Thread.sleep(1000);
                System.out.println("Thread " + j + " ends.");
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            finally
            {
                s.release();
            }
        }

    }).start();
}
于 2013-06-25T12:25:29.187 に答える
0

現在実行中のタスクに基づいてタスクベースを作成したいようです。ここに、別のタスクで新しいタスクを作成できる例があります。おそらく、あなたも見たいと思うかもしれませんjava.util.concurrent.ForkJoinPool

final ExecutorService executorService = Executors.newFixedThreadPool(5);

executorService.submit(new Runnable(){
    @Override
    public void run() {
        //code here which run by 5 threads, thread can be reused when the task is finished

        //new task can be created at the end of another task
        executorService.submit(...)
    }
});
于 2013-06-25T12:25:34.913 に答える