我需要做的是使用大小为3的 FixedThreadPool ,然后使用它来打印ThreadName,然后让它在指定的时间间隔内进入休眠状态一段时间并打印它完成后才醒来。我需要逐个线程地完成它,但我的输出将与所有3个线程一起出现。
期望的输出: pool-1-thread-1以800 ms到1000ms之间的随机时间间隔进入休眠状态
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();
}
}
答案 0 :(得分:1)
如果您正在紧接着创建对象(在相同的ms内),它们可能在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.
答案 1 :(得分:1)
仅使用1个线程创建线程池。如果你使用3个线程,那么最多可以同时运行3个runnable并且它不是你想要的。所以使用:
ExecutorService exe = Executors.newFixedThreadPool(1);
实际上更好的选择是使用newSingleThreadExecutor
,因为它明确表明它在任何给定时间只运行1次运行:
ExecutorService exe = Executors.newSingleThreadExecutor();
在两个方法中,两个方法都创建了{1}个线程,因此只有在命名时才会产生实际差异。
答案 2 :(得分:0)
除此之外,您的代码中存在问题。
Thread.yield();
是多余的。
如果您需要逐个执行,则不需要线程池。您只需在Sleep#run
循环中调用for
即可创建Sleep
类的不同实例。
答案 3 :(得分:0)
如果您需要使用FixedThreadPool
工作,并且您想要完成3个单独的线程,那么您应该使用Locks。像这样:第一个线程锁定入口锁定并退出解锁。接下来的线程将等待Lock重新启动并执行相同的操作。
在这里阅读更多内容:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html