尝试一下中断线程的睡眠,这个其实很好用,就假设某个线程在做事,做完了让他等着,然后当另一个线程触发某个条件,就会唤醒这个睡眠的线程。程序例子如下。
package ProcessAndThread.thread;
/**
* sleep()睡眠太久了,如果希望半道醒来,你应该怎么办?也就是说怎么叫醒一个正在睡眠的线程呢?
* 注意:这个不是终断线程的执行,是终止线程的睡眠
*/
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.setName("t");
thread.start();
//我们可以设定条件,这里假设就算是5s后叫t起来
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//中断t线程的睡眠,注意这种方式靠的是Java异常处理机制,会让t的睡眠语句块进入catch
thread.interrupt();
}
}
class MyRunnable implements Runnable {
/**
* 注意:run()方法中的异常不能throws,只能try...catch
* 因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多的异常
*/
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "--->begin");
//睡眠一年
try {
Thread.sleep(1000 * 60 * 60 * 24 * 365);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "--->end");
try {
doSome();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 其他方法是可以throws的,只不过对于run()里而言,还是只能try..catch
* @throws Exception
*/
public void doSome() throws Exception {
}
}