class Student//单例模式保证操作唯一对象(同一资源)
{
String name;
String sex;
int grade;
private Student(){}
private static final Student s = new Student();
public static Student getInstance()
{
return s;
}
boolean flag = false;//定义一个状态标记
}
class Input implements Runnable//Input实现Runnable接口
{
Student sin = Student.getInstance();//获得Student实例对象的引用
public void run()//复写run方法
{
int x = 0;//定义状态初始值
int a = 0;
while (a<30)//控制循环次数
{
synchronized(sin)//加锁,并为了验证单例,刻意在Input和Output中起不同的引用名=。=
{
if (sin.flag==true)//判断资源状态<================这里毕老师写的是if(sin.flag)不明白为什么//很显然flag初始化为假,所以if判断为假就不执行wait()
try
{
sin.wait();//如果资源里面有东西就等待
}
catch (Exception e)
{
}
if (x==0)
{
sin.name = "李雷";
sin.sex = "male";
sin.grade = 1;
}
else
{
sin.name = "韩梅梅";
sin.sex = "女女女女女女";
sin.grade = 2;
}
x = (x+1)%2;//用数值代表性别,控制交替执行
System.out.println("传入::::"+sin.name+"......"+sin.sex+"......"+sin.grade+"年级......"+a);
sin.flag = true;//执行后(input后),将资源状态量改变为true//然后线程运行到这flag被赋值为真,所以再运行到上面又要往资源里面存数据的时候上面的if()里面就判断为真, 这时候if判断为真,那么就需要执行wait()
sin.notify();//唤醒
}
a++;
}
}
}
class Output implements Runnable//Output实现Runnable接口
{
Student sou = Student.getInstance();//获得Student实例对象的引用,由于Student使用了单例模式,所以与Input中的sin指向的是同一个对象。
public void run()//复写run方法
{
int a = 0;
while (a<30)
{
synchronized(sou)//同步锁
{
if (sou.flag==false)//判断资源状态,如果里面没有东西就等待<================这里毕老师写的是if(!(sou.flag))不明白为什么//再然后线程运行到这flag值为真,所以!
真 即为假,就不会运行wait(),
try
{
sou.wait();
}
catch (Exception e)
{
}
System.out.println("传出::::"+sou.name+"~~~~~~"+sou.sex+"~~~~~~"+sou.grade+"年级~~~~~~"+a);
sou.flag = false;//输出后将资源状态切换为false//最后运行到这flag又被赋值为假,再运行到if(!sou.flag) 非假 就判断为真,那么此线程就需要wait(), 在wait()之前此线程唤醒了另外一个线程, 这时候flag值为假, 就重复这个顺序
sou.notify();//唤醒
}
a++;
}
}
}
class InputOutputDemo
{
public static void main(String[] args)
{
new Thread(new Input()).start();
new Thread(new Output()).start();
}
} 作者: Super_Class 时间: 2013-5-30 20:11
if (sin.flag==true)//判断资源状态<================这里毕老师写的是if(sin.flag)不明白为什么