java基础梳理-线程

86 阅读2分钟

思维导图pdf 百度网盘链接:pan.baidu.com/s/14DOGQ0pa… 提取码:xz4i

基本概念

  • 程序
  • 线程
  • 单线程/多线程
  • 并发/并行

线程的使用

创建

真正实现多线程的是start()中的start0()

  1. 某类继承thread类重写run方法
  2. 某类实现runnable接口重写run方法 用到了代理设计模式

image.png

thread/runnable区别

线程终止

  • 使用一个变量来控制线程终止
  • 线程任务完成自动结束

线程常用方法

用户线程/守护线程

线程生命周期

6个/8个

线程同步

  1. synchronized代码块
  2. 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();
            }
        }
    }
}