JAVA笔记(十二)-----线程间通信
线程间通信:其实就是多个线程在操作同一个资源,但操作的动作不同
notify():唤醒线程池中等待的线程
wait():线程等待,notiry唤醒(先等待先被唤醒)
notifyAll():唤醒线程池中松油等待线程
以上3个方法都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具备监视器。
为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步中线程时,都必须要表示它们所操作线程才有的锁,只有同一个锁上的“被等待”线程,才可以被对应同一个锁上的notify唤醒。
不可以对不同锁中的线程进行唤醒。
锁可以是任意对象,而Object是所有类的超类,所以定义在Object类中就可以被任意对象使用。
使用案例:
class ThreadDemo1 { synchronized (obj)
{
if(flag == true)
try{obj.wait();}catch(Exception e){}
..........
..........
flag = true;
notify();
} } class ThreadDemo2 { synchronized(obj)
{
if(!flag)
try{obj.wait();}catch(Exception e){}
........
........
flag = false;
notify();
}
}
因wait()方法定义中抛了异常但run方法中不可继续抛出异常,所以只能对异常进行内部try catch处理。
JDK1.5中提供多线程升级解决方案
将同步synchronized替换成显式Lock操作
将Object中的wait,notify,notifyAll替换成了Condition对象
该对象可以Lock锁进行获取。
示例
java.util.concurrent.locks class Resource { private Lock lock = new ReentrankLock();//看API文档
private Condition condition_pro = new lock.newCondition();
private Condition condition_con = new lock.newCondition();
public void set(String name) throws InterruptedException
{
lock.lock();
try
{
while(flag)
condition_pro.await();
this.name = name + “....” + count++;
flag = true;
condtion_con.signal();
}
finally
{
lock.unlock();//一定要释放锁,否则造成死锁
}
}
}
该示例中,实现了本方只唤醒对方操作。
停止线程:
1.定义循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可
2.使用interrupt()方法,中断线程
该方法是结束线程的冻结状态,使线程回到运行中来
注:stop方法已经过时不再使用
特殊情况:
当线程处于冻结状态,就不会读取到标记,那么该线程就不会结束
当没有指定方式让冻结线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。
Thread类中提供了该方法 interrupt()方法;
join():当A线程执行到B线程的join()方法时,A线程就会等待,当B线程执行完后,A线程才恢复执行。
join()可以用来临时加入线程执行
yeild():临时释放执行权,为了让线程执行频率均匀。

浙公网安备 33010602011771号