2

私がする必要があるのは、サイズ 3 のFixedThreadPoolを使用し、それを使用して ThreadName を出力し、指定された時間間隔内でランダムな時間スリープ状態にし、完了時に起動していることを出力することです。スレッドごとに実行する必要がありますが、3 つのスレッドすべてが一緒に出力されます。

望ましい出力: pool-1-thread-1 800 ミリ秒から 1000 ミリ秒の間のランダムな時間間隔でスリープ状態になる

pool-1-thread-1 はスリープ状態で終了

pool-1-thread-2 800 ミリ秒から 1000 ミリ秒の間のランダムな時間間隔でスリープ状態になります

pool-1-thread-2 はスリープ状態で終了

pool-1-thread-3 800 ミリ秒から 1000 ミリ秒の間のランダムな時間間隔でスリープ状態になります

pool-1-thread-3 スリープ状態

FixedThreadPool のみを使用する必要がある

import java.util.Random;
import java.util.concurrent.*;

class Sleep implements Runnable
{
 public void run()
  {
    Random ran = new Random();
    int randomnumber = ran.nextInt(1000-800+1)+800;
    System.out.print(Thread.currentThread().getName()+" ");
    System.out.println("Going to sleep for random amount of time interval between 800 ms and 1000ms");
    try
    {
        Thread.sleep(randomnumber);

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" done sleeping");
    Thread.yield();
 }
}

public class Ch6Ex3 
{
  public static void main(String[] args) 
   {
    ExecutorService exe = Executors.newFixedThreadPool(3);
    for(int i=0;i<3;i++)
    {
        exe.execute(new Sleep());
    }
    exe.shutdown();
  }
}
4

4 に答える 4

2

1 つのスレッドのみでスレッド プールを作成します。3 つのスレッドを使用する場合、最大 3 つの runnable を同時に実行できますが、これは望ましくありません。だから使用:

ExecutorService exe = Executors.newFixedThreadPool(1);

newSingleThreadExecutor実際には、常に1つのランナブルのみを実行することが明示的に示されているため、使用する方が良いオプションです。

ExecutorService exe = Executors.newSingleThreadExecutor();

内部的には、どちらのメソッドもThreadPoolExecutor1 つのスレッドで作成されるため、名前付けだけで実際の違いはありません。

于 2013-01-15T10:38:02.917 に答える
1

オブジェクトを次々と (同じミリ秒以内に) 作成している場合、それらはおそらく Random インスタンスに同じシードを持つため、同じ時間スリープします。

javadoc から:

Creates a new random number generator. Its seed is initialized to a value based on the current time:
 public Random() { this(System.currentTimeMillis()); }
Two Random objects created within the same millisecond will have the same sequence of random numbers.
于 2013-01-15T10:17:03.487 に答える
0

それに加えて、コードに問題があります。

Thread.yield();

冗長です。

1つずつ実行する必要がある場合は、スレッドプールは必要ありません。クラスの異なるインスタンスを作成するループSleep#run内から呼び出すことができます。forSleep

于 2013-01-15T10:20:37.960 に答える
0

それを使用して動作させる必要があり、作業をFixedThreadPool正確に 3 つの個別のスレッドで実行したい場合は、Locks を使用する必要があります。このように: 最初のスレッドは、入り口でロックをロックし、出口でロックを解除します。次のスレッドは、Lock が解放されるのを待って、同じことを行います。

ここでもっと読む:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html

于 2013-01-15T10:26:43.573 に答える