【PTA】5-7 使用同步机制协调线程的执行顺序

程序通过两个线程实现对整数的先加后乘操作,使用Java的同步机制(synchronized关键字和wait/notify方法)确保累加线程先执行,翻倍线程后执行,避免数据竞争问题。当累加线程完成后,它会唤醒等待的翻倍线程,保证执行顺序的正确性。
摘要由CSDN通过智能技术生成

5-7 使用同步机制协调线程的执行顺序(分数 6)

下面程序采用多个线程对整数执行先加后乘的计算,利用 Java 的同步机制,可以保证线程执行顺序的正确性。

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;    //设置累加线程结束标志
            
            // 此处填写代码(2分);
            
            break;
        case "翻倍":
            
            // 此处填写代码(2分)
            {
                try { 
                
                    // 此处填写代码(2分); //@@
                    
                } 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();
    }
}
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;    //设置累加线程结束标志
            notify();   // 唤醒线程
            break;
        case "翻倍":
            if(!ready)   // 若不满足ready=true条件则让出线程
            {
                try {
                	wait(); //@@使线程等待
                } 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();
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值