---------------- android培训、java培训、java学习型技术博客、期待与您交流!----------------
package com.Thread;
/*线程间通讯;
*其实就是多个线程操作同一个资源;
*但是操作的动作不一样;
*
*线程同步的前提:
* 1.两个线程以上;
* 2.用的是否是同一个锁;(同一个对象)
*
* 等待唤醒机制:
* 等待: wait(); ----> r.wait(); ---> 有异常抛出
* 唤醒: notify(); ----> r.notify();
*/
class Resource //定义资源类 多线程共同操作此资源
{
String name ;
String sex ;
boolean bool = false ; //定义内容是否为空
}
class Input implements Runnable { //实现Runnable接口
private Resource r = null ; //定义资源 用来接受同步资源
Input(Resource r){ //构造方法:把传入的同步资源赋给定义好的资源 r
this.r = r ;
}
public void run() { //复写 run()方法;
int i = 0;
while (true) {
synchronized (r) { //同步加锁(同步对象必须唯一 此锁必须和其他线程的锁一致)
if (r.bool) { //如果r.bool=true 里面有内容时, 让线程等待
try {
r.wait(); //等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//当 r.bool=false 内容为空或者线程被唤醒时 执行下面代码
if (i == 0) {
r.name = "rouse";
r.sex = "woman";
} else {
r.name = "杰克";
r.sex = "男";
}
i = (i + 1) % 2;
r.bool = true; //把内容表示为 已赋值
r.notify(); //唤醒
}
}
}
}
class OutputThread implements Runnable { //输出类
//定义资源 接收传入的多线程公用资源
private Resource r = null;
OutputThread(Resource r) {
this.r = r;
}
public void run() {
while (true) {
synchronized (r) { //此锁的对象必须要与其他线程的锁对象一致 (同一个锁)
if(!r.bool){
try {
r.wait(); //等等
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("姓名:" + r.name + "\t性别" + r.sex);
r.bool = false;
r.notify(); //唤醒
}
}
}
}
public class ThreadDemo5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource r = new Resource(); //实例化一个资源 多个线程共同操作此资源
Thread t1 = new Thread(new Input(r)); //创建一个线程:此线程操作内容赋值
Thread t2 = new Thread(new OutputThread(r)); //创建一个线程:此线程操作内容打印
t1.start(); //开启赋值的线程
t2.start(); //开启打印的线程
}
}