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 个可运行线程,这不是您想要的。所以使用:

ExecutorService exe = Executors.newFixedThreadPool(1);

实际上更好的选择是使用newSingleThreadExecutor,因为它明确表明它在任何给定时间只运行 1 个可运行对象:

ExecutorService exe = Executors.newSingleThreadExecutor();

在内部,这两种方法都ThreadPoolExecutor使用 1 个线程创建,因此它们之间仅在命名方面没有实际区别。

于 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();

是多余的。

如果您需要一个一个执行,则不需要线程池。您可以Sleep#runfor循环中调用创建不同的类实例Sleep

于 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 回答