1. 线程之间的协调控制(通知方式)
public class Homework04 {
public static void main(String[] args) {
// 在 main 方法中启动两个线程
// 第一个线程内循环打印 1 到 100 以内的整数
// 直到第二个线程从键盘读取到 "Q" 指令后结束第一个线程的运行
A01 a01 = new A01();
a01.start();
B01 b01 = new B01(a01);
b01.start();
}
}
// 创建 A 线程类, 循环打印 1 到 100 以内的整数
class A01 extends Thread {
private boolean loop = true;
@Override
public void run() {
while (loop) {
System.out.println((int) (Math.random() * 100 + 1));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程 A 退出... ");
}
public void setLoop(boolean loop) {
this.loop = loop;
}
}
// 创建 B 线程类, 从键盘读取到 "Q" 指令
class B01 extends Thread {
A01 A; // 将线程 A 当做属性, 线程 B 才能用通知的方式来操作线程 A
private Scanner scanner = new Scanner(System.in);
public B01(A01 a) {
A = a;
}
@Override
public void run() {
while (true) {
// 接收用户的输入
System.out.println("输入 Q 退出循环: ");
char key = scanner.next().toUpperCase().charAt(0);
if (key == 'Q') {
// 以通知的方式结束线程 A
A.setLoop(false);
System.out.println("线程 B 退出... ");
break;
}
}
}
}
运行结果:
2. 线程同步
public class Homework05 {
public static void main(String[] args) {
A02 a021 = new A02();
new Thread(a021).start();
new Thread(a021).start();
}
}
class A02 implements Runnable {
private int money = 10000;
public void setMoney(int money) {
this.money = money;
}
public int getMoney() {
return money;
}
@Override
public void run() {
// 取钱
synchronized (this) {
while (true) {
if (money <= 0) {
System.out.println("钱取完了, " + Thread.currentThread().getName() + "线程结束...");
break;
}
setMoney(getMoney() - 1000);
System.out.println(Thread.currentThread().getName() + "取了1000, 剩余:" + getMoney());
}
}
}
}
运行结果: