一、线程间通信概念
多个线程处理同一资源,但是任务不同。
二、线程间通信实例(参考代码:TreadCom1.java)
1、说明:Input和Output表示两个线程处理的两个任务,但是二者共同处理同一资源。
2、代码:TreadCom1.java
//线程之间没有通信,对于同一资源, 只是一边输入,一边输出。
class Resourse { //公共资源
String name;
String sex;
}
//输入线程
class Input implements Runnable {
Resourse r;
int x = 0;
Input(Resourse r) //保证同一个对象,同一个资源
{
this.r = r;
}
public void run() {
while (true) {
//同步代码块消除安全隐患
//不同的话,比如小强名字给了,但是性别还没执行的话,输出
//就变成小强。。。输出。。。nvnvnvnvnvnv
synchronized (r) {
//交换输入资源
if (x == 0) {
r.name = "小强";
r.sex = "男";
} else {
r.name = "小li";
r.sex = "nvnvnvnvnvnv";
}
}
x = (++x) % 2;
}
}
}
//输出线程
class Output implements Runnable {
Resourse r;
Output(Resourse r) //保证同一个对象,同一个资源
{
this.r = r;
}
public void run() {
while (true) {
synchronized (r) {
System.out.println(r.name + "。。。输出。。。" + r.sex);
}
}
}
}
public class TreadCom1 {
public static void main(String[] args) {
//同一资源
Resourse r = new Resourse();
//不同任务
Input i = new Input(r);
Output o = new Output(r);
//不同线程
Thread t1 = new Thread(i);
Thread t2 = new Thread(o);
t1.start();
t2.start();
}
}
说明:两个线程,一个输入、一个输出,处理同一资源,但是任务不同,一个输入数据,一个输出数据,所以,就要涉及线程间通信了,但是,上面的例子,线程之间并没明显的通信,下一节的涉及到等待唤醒机制就很明显了。