如何将特定线程置于睡眠状态()?

时间:2013-08-07 10:58:05

标签: java multithreading

我正在阅读Threads的sleep()方法。我试着开发一个小例子。我有两个 关于这个例子的混淆。

/**
 * Created with IntelliJ IDEA.
 * User: Ben
 * Date: 8/7/13
 * Time: 2:48 PM
 * To change this template use File | Settings | File Templates.
 */

class SleepRunnable implements Runnable{

  public void run() {
    for(int i =0 ; i < 100 ; i++){
      System.out.println("Running: " + Thread.currentThread().getName());
    }
    try {
      Thread.sleep(500);
    }
    catch(InterruptedException e) {
      System.out.println(Thread.currentThread().getName() +" I have been interrupted");
    }
  }
}

public class ThreadSleepTest {
  public static void main(String[] args){
    Runnable runnable = new SleepRunnable();
    Thread t1 = new Thread(runnable);
    Thread t2 = new Thread(runnable);
    Thread t3 = new Thread(runnable);
    t1.setName("Ben");
    t2.setName("Rish");
    t3.setName("Mom");
    t1.start();
    t2.start();
    t3.start();
  }
}
  1. 正如我在上一篇文章中所讨论的那样,如果一个线程在指定的时间后唤醒并且它只是从run方法返回,则会发生中断的异常。在我的这个例子中,代码永远不会进入catch()块。为什么会这样?
  2. 现在,上面例子中的所有线程都会休眠一秒钟并且会优雅地轮流,如果我特意想让线程“Ben”睡觉的话。我不认为这个例子是可能的。
  3. 有人可以进一步阐述这个概念。

4 个答案:

答案 0 :(得分:6)

1.当达到提示时,不会抛出InterruptedException。当你中断正在睡觉的线程时抛出它。

  

当线程正在等待,休眠或以其他方式占用时抛出,并且线程在活动之前或期间被中断。有时,方法可能希望测试当前线程是否已被中断,如果是,则立即抛出此异常。以下代码可用于实现此效果:     if(Thread.interrupted())//清除中断状态!         抛出新的InterruptedException();

2.执行代码只能使其成为当前线程的睡眠状态。因此,您可以按名称确定您的主题,例如:

if ("Ben".equals(Thread.currentThread().getName())) { 
try {
  Thread.sleep(500);
} catch (InterruptedException e) {}
}

答案 1 :(得分:4)

  

正如我在上一篇文章中所讨论的那样,如果出现中断异常将会发生   线程在指定的时间后唤醒并且它将简单地   从run方法返回。在我的这个例子中,代码永远不会   进入catch()块。为什么会这样?

您没有在代码中的任何位置调用interrupt()

t1.interrupt(); //this will throw the exception when t1 is sleeping
  

现在,上面示例中的所有线程都将休眠一秒钟   并且会优雅地轮流,如果我特别想做的话   线程“本”睡觉。我不这么认为这是可能的   示例

在这个例子中,线程没有轮流,确切地说,它们是在不知道彼此的情况下单独工作。

<强>提示: 检查当前线程的名称,如果名称为Ben则休眠。

Thread.currentThread().getName() //for getting the name of the current thread

修改

重现中断:将睡眠间隔增加到10000毫秒

主要方法代码:

Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
Thread t3 = new Thread(runnable);
t1.setName("Ben");
t2.setName("Rish");
t3.setName("Mom");
t1.start();
t2.start();
t3.start();

Thread.sleep(1000); //make the main thread to sleep for a sec

//time to interrupt t1 !!!!
t1.interrupt();   //throws Interrupted exception in the run method of Thread t1

答案 2 :(得分:2)

1)不正确,如果线程在指定的超时后唤醒,则不会发生InterruptedException,线程将简单地恢复运行。您的代码不会进入catch块,因为它从未被中断,请尝试此

...
t3.start();
t3.interrupt();
...

如果你想从t3看到InterruptedException。

2)我认为你可以做这样的事情

...
if (Thread.currentThread().getName().equals("Ben")) {
    try {
      Thread.sleep(500);
    }
    ...

}

答案 3 :(得分:0)

只有在运行时必须唤醒进程时才会发生InterruptedException。 通过sleep()使线程进入休眠状态将使其逃离处理器的线程队列。如果由于某种原因需要它的注意,那么它将触发InterruptedException InterruptedException也可能发生,当它正在运行时,处理器必须在其时间片用完之前从线程中取走控制权,这主要是因为有一个更高的piority任务需要注意。 至少,这是我记得的! :)