------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、线程通信
/*
线程间通讯:
其实就是过个线程在操作同一个资源
只是操作动作不同
*/
class Res
{
String name;
String sex;
boolean flag=false;
}
class Input implements Runnable
{
//Res r=new Res();这样创建对象不能保证是操作的同一个对象。
//通过建立私有引用保证了操作的是同一个对象。
private Res r;
//Object obj=new Object();
Input(Res r)
{
this.r=r;
}
public void run()
{
int x=0;
while(true)
{
synchronized(r)
{
while(r.flag)//用while和notifyAll避免了多个生产者和消费者这类的问题
try {r.wait();}catch(Exception e){}
//wait方法在object类中抛出了异常所以必须要try。
if(x==0)
{
r.name="mike";
r.sex="man";
}
else
{
r.name="丽丽";
r.sex="女女女女";
}
x=(x+1)%2;
r.flag=true;
r.notifyAll();
}
}
}
}
class Output implements Runnable
{
//Res r=new Res();
private Res r;
//Object obj=new Object();
Output(Res r)
{
this.r=r;
}
public void run()
{
while (true)
{
synchronized(r)
{
whlie(!r.flag)
try {r.wait();}catch(Exception e){}
System.out.println(r.name+"...."+r.sex);
r.flag=false;
r.notifyAll();
}
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
Res r=new Res();
Input in=new Input(r);
Output out=new Output(r);
Thread t1 = new Thread (in);
Thread t2 = new Thread (out);
t1.start();
t2.start();
}
}
二、lock
JDK1.5中提供了多线程升级解决方案。
将同步Synchronized替换为Lock操作。
将Object类中的wait,notify,notifyAll,替换为Condition对象。
该对象可以对Lock锁进行获取。
实现了本方只唤醒对方的操作。