案例1:
(1)在main方法中启动两个线程
(2)第1个线程循环随机打印100以内的整数
(3)直到第2个线程从键盘读取了“Q”命令。
package test;import java.util.Scanner;public class Main {public static void main(String[] args) {A a = new A();B b = new B(a);//一定要注意.a.start();b.start();}}//创建A线程类class A extends Thread {private boolean loop = true;@Overridepublic void run() {//输出1-100数字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) {//可以修改loop变量this.loop = loop;}}//直到第2个线程从键盘读取了“Q”命令class B extends Thread {private A a;private Scanner scanner = new Scanner(System.in);public B(A a) {//构造器中,直接传入A类对象this.a = a;}@Overridepublic 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:
(1)有2个用户分别从同一个卡上取钱(总额:10000)
(2)每次都取1000,当余额不足时,就不能取款了
(3)不能出现超取现象=》线程同步问题.
package test;public class Main {public static void main(String[] args) {T t = new T();Thread thread1 = new Thread(t);thread1.setName("t1");Thread thread2 = new Thread(t);thread2.setName("t2");thread1.start();thread2.start();}}//编程取款的线程//1.因为这里涉及到多个线程共享资源,所以我们使用实现Runnable方式//2. 每次取出 1000class T implements Runnable {private int money = 10000;@Overridepublic void run() {while (true) {//解读//1. 这里使用 synchronized 实现了线程同步//2. 当多个线程执行到这里时,就会去争夺 this对象锁//3. 哪个线程争夺到(获取)this对象锁,就执行 synchronized 代码块, 执行完后,会释放this对象锁//4. 争夺不到this对象锁,就blocked ,准备继续争夺//5. this对象锁是非公平锁.synchronized (this) {////判断余额是否够if (money < 1000) {System.out.println("余额不足");break;}money -= 1000;System.out.println(Thread.currentThread().getName() + " 取出了1000 当前余额=" + money);}//休眠1stry {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}

