指教一下多线程

genguyige 2011-03-05 10:31:40
那个银行存款取款的那个很经典的银行存款取款的例子

package com;

public class TestThreadBank {

private String name; //name
private double balance; //balance
public TestThreadBank(String name){
this.name=name;
this.balance=0;
}
public String getName(){
return name;
}
public double balance(){

return balance;
}

public void put(double value) //存款操作
{
if(value>0){
this.balance+=value;
}
}
public double get(double value){//取款操作
if(value>0){
if(value<this.balance)
this.balance-=value;
else{
value=this.balance;
this.balance=0;
}
return value;

}
return 0;
}
public static void main(String args[]){//主方法

TestThreadBank bank=new TestThreadBank("wang");
//TestThreadBank bank2=new TestThreadBank("xiang");
(new Save(bank, 100)).start();
(new Save(bank, 200)).start();
(new Fetch(bank, 300)).start();

}
}

class Save extends Thread{
private TestThreadBank countBank;
private double value;
public Save(TestThreadBank A,double value)//存款类
{
this.countBank=A;
this.value=value;

}
public void run(){
synchronized (this.countBank) {
double howmach=this.countBank.balance();
this.countBank.put(value);
try{
sleep(1);
}catch (InterruptedException e) {
// TODO: handle exception
}
System.out.println(this.countBank.getName()+"账户:现有"+howmach+"存入"+this.value+"余额"+this.countBank.balance());

}
}
}
class Fetch extends Thread{
private TestThreadBank countBank;
private double value;
public Fetch(TestThreadBank A1,double value){
this.countBank=A1;
this.value=value;

}
public void run(){
synchronized (this.countBank) {
double howmatch=this.countBank.balance();
try {
sleep(1);
} catch (InterruptedException e) {
// TODO: handle exception
}
System.out.println(this.countBank.getName()+"账户:现有"+howmatch+"取走"+this.countBank.get(value)+"余额"+this.countBank.balance());

}
}
}






在这个里面书上介绍说只要给临界资源加上同步锁,那么就能实现先存100 再存200 再取300 的效果
但是 但是我PC上就是不按照顺序执行 或者说我创建的三个线程不是按照创建的时候来执行的
很困惑 希望各位大牛能给我解释一下
...全文
50 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouYunan2010 2011-03-05
  • 打赏
  • 举报
回复
互相抢夺资源,谁先执行谁知道了?
genguyige 2011-03-05
  • 打赏
  • 举报
回复
不同的系统是不是会不一样

为什么教科书上写的根本不同呢
dracularking 2011-03-05
  • 打赏
  • 举报
回复
无间隔顺序启动的线程第一次执行顺序是未确定的,因为线程start之后,到开始执行之间的间隔是不定的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧