有多少方法实现设置java线程熟睡一段时间并可随时被唤醒

有多少方法实现设置java线程沉睡一段时间并可随时被唤醒
有什么办法实现写两个同时开始的线程,线程A沉睡一小时,而线程B三秒后唤醒A。我知道的只有设置一个static flag和time标记,两线程通过标记确定A是否跳出while((xx.flag != 3)&&(thread.time!=3600)){ Thread.sleep(1000)}循环,有没有其他方法
------解决思路----------------------
提供两种常见的方法:

1.线程B持有线程A的Thread对象的引用(假设为ta),线程A调用Thread.sleep(3600*1000)休眠一小时,线程B在3秒后调用ta.interrupt(),线程A被唤醒并且sleep方法抛出一个InterruptedException。

2.线程A、B持有一个相同对象的引用(假设为ox),线程A使用这个代码,将在wait处阻塞一小时:

synchronized(ox) {
try {
ox.wait(1000*3600);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

线程B在三秒后执行这段代码:

synchronized(ox) {
ox.notify();
}

线程A被唤醒,且不抛出InterruptedException。