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了
java多线程问题:synchronized函数不是保证一个线程执行完了之后,在执行下一个线程么
答案:2 悬赏:40 手机版
解决时间 2021-01-30 14:01
- 提问者网友:心如荒岛囚我终老
- 2021-01-30 10:25
最佳答案
- 五星知识达人网友:酒安江南
- 2021-01-30 10:58
会计.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了.
当某个线程运行到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了.
全部回答
- 1楼网友:行路难
- 2021-01-30 11:05
会计=new Thread(this);
出纳=new Thread(this);
这个就算new 100个 都是操作一个对象 变量weekDay就是使用一个
就是谁抢到谁执行 所以不像你预期的那样 你一下我一下
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯