永发信息网

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

答案:2  悬赏:40  手机版
解决时间 2021-01-30 14:01
package 线程TEST包;
import java.awt.*;
import java.awt.event.*;
public class FrameMoney extends Frame implements Runnable,ActionListener {


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了
最佳答案
会计.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了.
全部回答
会计=new Thread(this); 出纳=new Thread(this); 这个就算new 100个 都是操作一个对象 变量weekDay就是使用一个 就是谁抢到谁执行 所以不像你预期的那样 你一下我一下 再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
爱巢家饰地址在哪,我要去那里办事
某次知识竞赛共出了25道题,评分办法是
【绿丝带的含义】红丝带、绿丝带各代表什么意
中国移动(沙湾服营业厅)怎么去啊,我要去那办
国联家电城地址在什么地方,想过去办事
凯声的意思是什么啊?知道的请说下!
中国移动(龙福西路店)地址在什么地方,我要处
西瓜用泰语翻译,西瓜怎么说帮下我吧
我在广州的农商银行往东莞的农商银行的银行卡
卓异户户通机顶盒已经开户了,但是授权丢失了
com.microsoft.sqlserver.jdbc.SQLServerExce
无慝的意思是什么啊?知道的请说下!
求助,高7 1.4t 4万公里保养内容和价格
大家初次玩生化时,被虐过吗
中国移动(佳音购机中心)地址在什么地方,想过
推荐资讯
百度如何建贴吧
【得其大者兼其小】得其大者可以兼其小,未有
可以点歌的软件直播
春秋战国的华夏文明,古希腊文明,谁的成就更
脸部伤口缝合过能不能吃饼干
一无所有的意思是什么啊?知道的请说下!
新惠镇第一小学地址在哪,我要去那里办事
红辉健身地址在什么地方,我要处理点事
开纹身店起什么店名好?
孝感市建设职业技能培训中心地址在什么地方,
家养的猫,从来不出门也会生跳蚤吗
65°43′12″换算成多少度
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?