请帮我看看代码有什么问题class MagicMoney implements Runnable{ private int money;//线程共享变量 private boolean ready=false;//累加线程结束标志 MagicMoney(int money){ this.money=money; } //线程体 synchronized public void run() {//同步方法用 synchronized 修饰 switch (Thread.currentThread().getName()) { //按名字区分不同线程 case "累加": money+=100; ready=true; //设置累加线程结束标志 Thread.yield(); break; case "翻倍": synchronized (this) { try { Thread.sleep(100);//@@ } catch (InterruptedException e) { } } money*=2; break; } System.out.println("你手上有"+money+"$"); } } public class Main { public static void main(String[] args) { MagicMoney m=new MagicMoney(50);//创建接口实现类对象 Thread s1=new Thread(m,"累加");//创建线程对象 Thread s2=new Thread(m,"翻倍"); s2.start();//启动线程 s1.start(); } }
时间: 2024-02-14 10:08:05 浏览: 26
这段代码存在几个问题:
1. 在累加线程结束时,没有进行等待,可能会导致翻倍线程在累加线程结束之前就执行了money*=2操作,从而得到错误的结果。
2. 在翻倍线程中,使用了synchronized关键字,但是没有指定同步的对象,应该把synchronized块改为synchronized(this)。
3. 在翻倍线程中,使用了Thread.sleep(100),这会使线程暂停100毫秒,但是没有明确说明为什么要暂停,这可能会导致程序出现难以预料的问题。
4. 在累加线程中,使用了Thread.yield(),这会让线程让出CPU,但是也不明确说明为什么要让出CPU,也可能会导致程序出现问题。
建议修改代码如下:
```
class MagicMoney implements Runnable {
private int money; //线程共享变量
private boolean ready = false; //累加线程结束标志
MagicMoney(int money) {
this.money = money;
}
//线程体
synchronized public void run() { //同步方法用 synchronized 修饰
switch (Thread.currentThread().getName()) { //按名字区分不同线程
case "累加":
money += 100;
ready = true; //设置累加线程结束标志
synchronized (this) {
notifyAll(); //唤醒所有等待该对象的线程
}
break;
case "翻倍":
synchronized (this) {
try {
wait(); //等待累加线程结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
money *= 2;
break;
}
System.out.println("你手上有" + money + "$");
}
}
public class Main {
public static void main(String[] args) {
MagicMoney m = new MagicMoney(50); //创建接口实现类对象
Thread s1 = new Thread(m, "累加"); //创建线程对象
Thread s2 = new Thread(m, "翻倍");
s1.start();
s2.start(); //启动线程
}
}
```
在累加线程结束时,使用notifyAll()唤醒所有等待该对象的线程;在翻倍线程中使用wait()等待累加线程结束;去掉了Thread.yield()和Thread.sleep(),使代码更加简洁和清晰。