中关村黑马程序员训练营 ——- 多线程间通讯及多线程等待唤醒机制
.——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
多线程间通讯: 其实就是多个线程在操作同一个资源, 但是操作的动作不同。
多线程等待唤醒机制
两个线程在操作同一个共享数据资源时。一个线程执行运行数据资源时,另一线程等着不能动
1.要用到监视器锁 wait() notify(); notifyAll(); 都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
2. wait() notify(); notifyAll() 这些操作线程的方法要定义Object类中
这些方法在操作同步中线程时,都必须要标识它们所操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。不可以对不同锁中的线程进行唤醒。 线程1input 线程2output 要共用同一个锁,把obj作为锁不成立 因为 线程1input 线程2output 都各自有自己的this 也不行 线程1input 有自己的本类对象Input in = new Input(); 线程2output 有自己的本类对象 Output ou = new Output()本类对象各个不同
3.在内存里有四个类Res Input Output DanLi 他们对应的class字节码也有是个 Res.class Input.class Output.class DanLi.class
任意哪一个作为对象锁都行 不唯一 所以要找一个唯一的对象锁 只有 Res r = new Res();是唯一的对象所 就用 r作为锁
// 建立个共享的资源库 里面有属性变量 Sring 那么 Sring sex
class Res
{
//默认的构造函数
//Res r = new Rew();
String name ;
String sex;
}
//class Input与 class Output 都在调用类 Res的对象 不能保证对象的唯一性
class Input implements Runnable
{
Object obj = new Object();
//Res r = new Res();
// 建立构造函数 Input(Res r) 往里传入参数列表 Res(类型) r(变量) Res r 引用 Input(Res r)初始化
private Res r;
Input(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{
int x = 0;
synchronized (r) //
{
if(x == 0)
{
// 对 强强 和 丽丽 这两个人实行切换输出打印
r.name = "强强";
r.sex = "男";
System.out.println(r.name+"......................"+r.sex);
}
else
{ r.name = "丽丽";
r.sex = "女";
System.out.println(r.name+"...................."+r.sex);
}
x = (x+1)%2;
}
}
}
}
class Output implements Runnable
{
Object obj = new Object();
//Res r = new Res();
private Res r;
Output(Res r)
{
this.r = r;
}
public void run()
{
while(true)
{ //r.name; //r.sex;
synchronized(r)
System.out.println(r.name+" ::"+r.sex);
}
}
}
}
class DanLi
{
public static void main(String[] args)
{
//首先现有资源 class Res 建立资源类的对象Res r = new Res()
Res r = new Res();
//子线程 Input 实现了run() 要建立子线程对象 Input in = new Input(r)
Input in = new Input(r);
//子线程 Output 实现了run() 要建立子线程对象 Output in = new Output(r)
Output ou = new Output(r);
Thread t1 = new Thread(in); //创建线程t1 new Thread(in) input(r) 传进去
t1.start(); //开启线程t1 运行 Input 的run()方法 运行 input(r)
Thread t2 = new Thread(ou); //创建线程t2 高数公路new Thread(ou) output(r) 传进去
t2.start(); //开启线程t2 运行 Output 的run()方法 运行output(r)
System.out.println("主线程..............");
}
}