您的位置:首页 > 编程语言 > Java开发

JAVA多线程之——线程之间的通信

2017-03-25 10:45 225 查看
概要

我们知道线程是操作系统中一个独立的个体,在一般多线程环境下,我们希望的是各个线程之间有一定的关联,使得各个线程组合成一个整体工作。那么就必须要使线程之间互相能传递信息。这就是线程之间需要通信。线程通信可以采取wait/notify 方法实现通信(当然还有其它通信方式。这节只学习wait/notify 方法)。

wait/notify定义

1.wait/notify方法定义在Object类中。这说明JAVA中多有对象都拥有wait/notify方法。那么为什么wait/notify方法是用来实现线程之间的通信,为何不定义在Thread中呢?首先看一下源码:

/**The current thread must own this object's monitor. The thread
* releases ownership of this monitor and waits until another thread
* notifies threads waiting on this object's monitor to wake up
* */
public final void wait() throws InterruptedException {
wait(0);
}
官方文档中开头的一段解释就是,使用wait方法,那么当前的线程必须要是某个对象的监控者。换句话说,就是要使用wait方法就必须要拥有某个对象的锁。也就是说wait/notify依赖于对象锁。而锁可以是任意一个对象都可以拥有。那么就意味着必须任意的对象都可以调用wait/notify方法。那么这些方法就只能定义在Object中。

**wait/notify使用**


public class ThreadTest3 {

private volatile int i = 0;

public void method1() {
i++;
}

public int getI() {

return i;

}

public static void main(String[] args) {

final ThreadTest3 test3 = new ThreadTest3();

final Object lock = new Object();

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
for (int k = 0; k < 10; k++) {
test3.method1();
System.out.println("i自增1 ");
if (test3.getI() == 5) {
System.out.println("发出通知。。。。。。");
lock.notify();
}
Thread.currentThread().sleep(500);
}

} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

}, "t1");

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
if(test3.getI() != 5) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

System.out.println("收到通知。。。。。。。。。停止工作");
throw new RuntimeException();
}

}, "t2");

t2.start();
t1.start();

}


}

上述代码运行结果:


i自增1

i自增1

i自增1

i自增1

i自增1

发出通知。。。。。。

i自增1

i自增1

i自增1

i自增1

i自增1

收到通知。。。。。。。。。停止工作

Exception in thread “t2” java.lang.RuntimeException

at thread.day2.ThreadTest3$2.run(ThreadTest3.java:61)

at java.lang.Thread.run(Thread.java:745)

“`

结果分析:当我们启动先启动t2线程时候,获取了lock的锁,第一次进去i不等与5,t2调用wait方法进入等待,然后t1获取lock同步锁,对i进行自增,在等于5的时候,发出通知调用notify方法。但运行的结果是知道t1运行完成后。t2才执行了停止工作。

结果总结:

1.wait释放所。并且wait方法是停止当前拥有该对象同步锁的线程

2.notify不释放锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 线程