需要通信的多种方式以及注意事项请移步:http://ifeve.com/thread-signaling/
线程通信方式:
1:多个线程之间通过共享变量通信。也就是A线程修改了变量x=11,B线程拿到x的值就是A修改之后的值11。这也是线程之间的间接通信。
2.通过方法wait,notiy,notifiAll.
wait:A线程调用了该方法,那么A线程将沉睡,也就是没有了CPU执行权,需要其他线程调用notify或者notifyAll唤醒,才会有CPU执行权,但是有了CPU执行权不代表A线程可以继续执行代码,因为还需要获取锁。所以调用wait代表改线程失去了CPU执行权和锁。
notify:随机唤醒一个需要同一把锁的线程。被唤醒的线程拥有了CPU执行权。锁的释放不是由该方法管理。
notifyAll:唤醒所有需要同一把锁的线程,所有的唤醒线程拥有了CPU执行权,然后所有线程共同竞争锁。和notify的区别就是notifyAll是唤醒所有线程,其余特性一致。
package com.concurenny.chapter.eight;
/**
* 创建者:Mr lebron 创建时间:2017年11月17日 下午4:03:01
*/
public class NotifyDemo {
public static void main(String[] args) {
new Thread(() -> {
wait2();
}).start();
new Thread(() -> {
wait2();
}).start();
new Thread(() -> {
notify2();
}).start();
}
public static synchronized void wait2() {
while (true) {
System.out.println("wait 前:");
try {
NotifyDemo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait 后:");
}
}
public static synchronized void notify2() {
System.out.println("notify 前:");
NotifyDemo.class.notify();
System.out.println("notify 后:");
}
}
package com.concurenny.chapter.eight;
/**
* 创建者:Mr lebron 创建时间:2017年11月17日 下午4:03:01
*/
public class NotifyAllDemo {
public static void main(String[] args) {
new Thread(() -> {
wait2();
}).start();
new Thread(() -> {
wait2();
}).start();
new Thread(() -> {
notifyAll2();
}).start();
}
public static synchronized void wait2() {
while (true) {
System.out.println("wait 前:");
try {
NotifyAllDemo.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait 后:");
}
}
public static synchronized void notifyAll2() {
System.out.println("notify 前:");
NotifyAllDemo.class.notifyAll();
System.out.println("notify 后:");
}
}