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();
}
}