线程通信
线程由运行到阻塞 再到就绪
主要用到的方法
Object类中的
- wait()//时线程处于等待状态,如果没有线程来唤醒 那么该线程将一直处于等待状态,直到有线程调用notify /notifyAll来唤醒该线程。
- wait(long min); 也会是线程处于等待状态;线程重新回到就绪状态的条件:一 、等到的时间到 二、 有线程调用notify /notifyAll来唤醒该线程
- notify():唤醒当前处于等待状态的所有线程中的随机的一个
- notifyAll():唤醒当前处于等待状态的所有的线程
在线程通信中,首先要保证线程执行的任务时同步的(可以时同步代码块/也可以时同步方法)
在线程通信中,有谁来执行wait和notify?
在其中只能有锁对象来执行wait和notify
package org.lanqiao.thread.demo;
/*
* 要求:在线程执行输出的时候,太原师范和蓝桥软件轮流输出
*
*/
public class ThreadDemo {
static boolean flag = false;
public static void main(String[] args) {
Object obj = new Object();
new Thread() {
public void run() {
while(true) {
synchronized (obj) {
if(flag) {
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print("太");
System.out.print("原");
System.out.print("师");
System.out.print("范");
System.out.println();
flag = true;
obj.notifyAll();
}
}
}
}.start();
new Thread() {
public void run() {
while(true) {
synchronized (obj) {
if(!flag) {
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print("蓝");
System.out.print("桥");
System.out.print("软");
System.out.print("件");
System.out.println();
flag = false;
obj.notifyAll();
}
}
}
}.start();
new Thread() {
public void run() {
while(true) {
synchronized (obj) {
if(!flag) {
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print("山");
System.out.print("西");
System.out.print("晋");
System.out.print("中");
System.out.println();
flag = false;
obj.notifyAll();
}
}
}
}.start();
}
}