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; //设置累加线程结束标志 case++ ; break; case "翻倍": { try { ; //@@ } 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 19:35:27 浏览: 28
这段代码是一个 Java 程序,实现了一个 MagicMoney 类,它实现了 Runnable 接口,并覆盖了 run() 方法。该类有一个共享变量 money 和一个标志变量 ready,同时有两个线程累加和翻倍。
在 run() 方法中,使用了同步方法 synchronized 来保证线程安全。首先根据线程名称区分不同的线程,然后执行不同的操作。对于累加线程,将 money 加上 100,并设置 ready 标志为 true;对于翻倍线程,将 money 乘以 2。最后输出当前的 money 值。
在 main() 方法中,创建了一个 MagicMoney 对象 m,并创建了两个线程 s1 和 s2,并将 m 对象作为参数传递给这两个线程。然后启动这两个线程。
需要注意的是,在这个程序中,累加线程和翻倍线程的执行顺序是不确定的,因为它们是异步执行的。如果需要让这两个线程同步执行,可以使用 wait() 和 notify() 方法来进行线程间的通信。
相关问题
请帮我看看代码有什么问题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(); } }
这段代码存在几个问题:
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(),使代码更加简洁和清晰。
class Account implements Runnable{ private int money; //修改方法 @Override public void run() { // TODO Auto-generated method stub } 给上代码写一个访问方法
以下是一个简单的访问方法,可以获取 Account 对象中的 money 属性:
```
public synchronized int getMoney() {
return money;
}
```
这里使用 synchronized 关键字来保证线程安全,确保在多线程环境下获取 money 属性的值是正确的。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)