思维导图pdf 百度网盘链接:pan.baidu.com/s/14DOGQ0pa… 提取码:xz4i
基本概念
- 程序
- 线程
- 单线程/多线程
- 并发/并行
线程的使用
创建
真正实现多线程的是start()中的start0()
- 某类继承thread类重写run方法
- 某类实现runnable接口重写run方法 用到了代理设计模式
thread/runnable区别
线程终止
- 使用一个变量来控制线程终止
- 线程任务完成自动结束
线程常用方法
用户线程/守护线程
线程生命周期
6个/8个
线程同步
- synchronized代码块
- synchronized方法
静态方法/非静态方法的互斥锁要求不一样
线程死锁
释放锁
- 会释放锁的情况
- 不会释放锁的情况
练习题
一.
(1)在main方法中启动两个线程
(2)第1个线程循环随机打印100以内的整数
(3)直到第2个线程从键盘读取了.“Q”命令。
public class Exercise01 {
public static void main(String[] args) {
A a = new A();
a.start();
B b = new B(a);
b.start();
}
}
class A extends Thread {
private Boolean loop = true;
@Override
public void run() {
while (loop) {
System.out.println("i= " + (int)(Math.random() * 100 + 1));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setLoop(Boolean loop) {
this.loop = loop;
}
}
//控制A线程
class B extends Thread {
private A a;
private Scanner scanner = new Scanner(System.in);
public B(A a) {
this.a = a;
}
@Override
public void run() {
while (true) {
System.out.println("请输入你的指令,(Q)退出");
char ch = scanner.next().toUpperCase().charAt(0);
if (ch == 'Q') {
//将A线程退出
a.setLoop(false);
System.out.println("B线程退出");
break;
}
}
}
}
二.
(1)有2个用户分别从同一个卡上取钱(总额:10000)
(2)每次都取1000,当余额不足时,就不能取款了
(3)不能出现超取现象=》线程同步问题
public class Exercise02 {
public static void main(String[] args) {
Bank bank = new Bank();
new Thread(bank).start();
new Thread(bank).start();
}
}
class Bank implements Runnable {
private double money = 10000;
// private Scanner scanner = new Scanner(System.in);
// private Boolean loop = true;
// private Object object = new Object();
@Override
public void run() {
while (true) {
synchronized (this) {
if (money <= 0) {
System.out.println("余额为0");
// loop = false;
break;
}
// System.out.print("输入取钱金额:");
// double mon = scanner.nextDouble();
money -= 1000;
System.out.println(Thread.currentThread().getName() + "取出1000元" +
"剩余" + money);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}