class Bank implements Runnable
{
int money = 100; // 声明一个int型变量money,初值为100
Thread zhang,keven;
Bank()
{
zhang = new Thread(this); // 创建zhang,Bank对象为zhang的目标对象
zhang.setName("会计");// 设置zhang线程的名字为“会计”
keven = new Thread(this);// 创建keven,Bank对象为keven的目标对象
keven.setName("出纳");// 设置keven线程的名字为“出纳”
}
public void run()
{
int i = 0;// 声明一个int类型变量i,初值为0
while(true)
{
if(zhang.getState().equals(Thread.State.RUNNABLE)) // 判断线程zhang是否正在占有CUP资源
{
i=i+1;
money=money+1;
System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
if(i>=6)
{
System.out.printf("%s线程进入死亡状态\n",zhang.getName());
zhang.stop(); // 使得线程zhang进入死亡状态
}
try{
Thread.sleep(2000);
}
catch(InterruptedException e)
{
System.out.println("e");
}
}
else if(keven.getState().equals(Thread.State.RUNNABLE)) // 判断线程keven是否正在占有CUP资源
{
i=i-1;
money=money-1;
System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
if(i<=-6)
{
System.out.printf("%s线程进入死亡状态\n",keven.getName());
keven.stop(); // 使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("e");
}
}
}
}
}
class BankExample
{
public static void main(String args[ ])
{
Bank bank=new Bank();
bank.zhang.start();
bank.keven.start();
}
}
输出结果是:会计将money的值改为101
会计将money的值改为102 会计的局部变量i=1
会计的局部变量i=1出纳将money的值改为101 出纳的局部变量i=0会计将money的值改为102 会计的局部变量i=2出纳将money的值改为101 出纳的局部变量i=-1出纳将money的值改为100
会计将money的值改为101 会计的局部变量i=3
出纳的局部变量i=-2出纳将money的值改为100 出纳的局部变量i=-3会计将money的值改为101 会计的局部变量i=4出纳将money的值改为100 出纳的局部变量i=-4出纳将money的值改为99 出纳的局部变量i=-5会计将money的值改为100 会计的局部变量i=5出纳将money的值改为99 出纳的局部变量i=-6
出纳线程进入死亡状态会计将money的值改为100 会计的局部变量i=6
会计线程进入死亡状态我想问下:
会计将money的值改为101
会计将money的值改为102 会计的局部变量i=1
会计的局部变量i=1是怎么出现的PS:是老师给的实验,我写完了总觉得有哪里不对,带注释的前面就是要求填的,我不明白老师到底是想要会计和出纳都只能修改6次还是说反复进出知道有个到了6或者-6为止
if(zhang.getState().equals(Thread.State.RUNNABLE)) // 判断线程zhang是否正在占有CUP资源
{
i=i+1;
money=money+1;
System.out.printf("\n%s将money的值改为%d\t",zhang.getName(),money);
System.out.printf("%s的局部变量i=%d\n",zhang.getName(),i);
if(i>=6)
{
System.out.printf("%s线程进入死亡状态\n",zhang.getName());
zhang.stop(); // 使得线程zhang进入死亡状态
}
try{
Thread.sleep(2000);
}
catch(InterruptedException e)
{
System.out.println("e");
}
}
else if(keven.getState().equals(Thread.State.RUNNABLE)) // 判断线程keven是否正在占有CUP资源
{
i=i-1;
money=money-1;
System.out.printf("\n%s将money的值改为%d\t",keven.getName(),money);
System.out.printf("%s的局部变量i=%d\n",keven.getName(),i);
if(i<=-6)
{
System.out.printf("%s线程进入死亡状态\n",keven.getName());
keven.stop(); // 使得线程keven进入死亡状态
}
try{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
System.out.println("e");
}
}
}
money=money+1; i=i-1;
money=money-1;
bank.zhang.start();的时候递增了一次,
然后bank.keven.start();又递增了一次?
我把zhang.getName(),keven.getName()全替换成Thread.currentThread().getName()
就明白了但本身这个实验这种写法是不是有哪不清楚,要实现zhang线程只能money+1,keven线程只能money-1;在这个基础上靠加synchronized可以完成么,试了几次都不太对