java多线程问题:synchronized函数不是保证一个线程执行完了之后,在执行下一个线程么

package线程TEST包;importjava.awt.*;importjava.awt.event.*;publicclassFrameMoneyextendsFr... package 线程TEST包;
import java.awt.*;
import java.awt.event.*;
public class FrameMoney extends Frame implements Runnable,ActionListener {

/**
* @param args
*/
Thread 会计,出纳;
Button button;
TextArea text1,text2;
int money=100;
int weekDay;
FrameMoney(){
会计=new Thread(this);
出纳=new Thread(this);
button=new Button("start");
text1=new TextArea(12,15);
text2=new TextArea(12,15);
this.setLayout(new FlowLayout());
setSize(360,300);
add(button);
add(text1);
add(text2);
this.setVisible(true);
this.validate();
button.addActionListener(this);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new FrameMoney();
}

@Override
public void run() {
// TODO Auto-generated method stub
if(Thread.currentThread()==出纳||Thread.currentThread()==会计){
for(int i=1;i<5;i++){
weekDay=i;
restore(30);
}
}
}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!(出纳.isAlive())){
会计=new Thread(this);
出纳=new Thread(this);
}
try {
会计.start();
出纳.start();
} catch (Exception e2) {
// TODO: handle exception
}

}
public synchronized void restore(int number){
if(Thread.currentThread()==会计){
text1.append("今天是星期:"+weekDay+"\n");
for(int i=0;i<3;i++){
money+=number;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
text1.append("账上有"+money+"万\n");
}

}
else if(Thread.currentThread()==出纳){
text2.append("今天是星期:"+weekDay+"\n");
for(int i=0;i<3;i++){
money-=number/2;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
text2.append("账上有:"+money+"万\n");
}

}
}
}
//1.1为什么我的出纳线程不是在会计的星期1线程结束后,接管线程运行,而是等到会计全部运行完了之后才开始运行。
//1.2为什么我的出纳线程的星期是从星期4开始的呀!不是从自己线程的星期1开始么
//1.3为什么我的出纳线程从星期4,又回到星期2,在3,在4.。为什么这么奇怪了?
但是,我每个线程都休眠了一段时间呀!在说,我的出纳,为什么是从星期4,在又回到星期2了,星期3了
展开
 我来答
dmy1101
2012-06-18 · 超过12用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:31.5万
展开全部
会计.start();出纳.start();然后两个线程开始运行.
当某个线程运行到restore(30)语句时,开始竞争"this"对象的锁(就是new Thread(this)中的这个this).若得到了,就运行restore方法,运行完后,释放锁.
然后两个线程再次竞争锁,具体哪个线程获得锁的概率大些与你的java虚拟机有关,完全是不可控的.

至于1.2,1.3这两个情况,举个例子吧:
for(int i=1;i<5;i++){
weekDay=i;
restore(30);
}
当出纳第一次运行restore方法时(第一次得到锁),此时weekDay应该是为一吧.
然后运行到text2.append("今天是星期:"+weekDay+"\n");这句语句之前(注意是之前!)时,会计运行到weekDay=i;语句,把weekDay变成了4.
这时你的出纳就输出4了.
xuchongqi2012
2012-06-18 · TA获得超过113个赞
知道小有建树答主
回答量:174
采纳率:0%
帮助的人:122万
展开全部
会计=new Thread(this);
出纳=new Thread(this);
这个就算new 100个 都是操作一个对象 变量weekDay就是使用一个
就是谁抢到谁执行 所以不像你预期的那样 你一下我一下
更多追问追答
追问
但是,我每个线程都休眠了一段时间呀!在说,我的出纳,为什么是从星期4,在又回到星期2了,星期3了
追答
你休眠的不是每个线程 是同步代码块 而同步代码那部分只能一个线程在一个时间段能执行 所以你休眠的那部分没什么用可以去掉 是没用的代码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式