• 实现多线程
      • 1.1进程
      • 1.2线程
      • 1.5线程调度
      • 1.6线程控制
      • 1.7线程生命周期
      • 1.8多线程的实现方式
      • 卖票案例分析
    • 线程同步
    • Lock锁
    • 生产者消费者


    实现多线程

    1,进程

    image.png
    2,线程

    image.png

    3,多线程的实现方式

    image.png

    • 创建一个新的执行线程有两种方法。一个是将一个类声明为一个Thread的子类。这个子类应该重写run类的方法Thread 。
    • 创建线程的另一种方法是声明一个实现Runnable接口的类。那个类然后实现了run方法。

    image.png
    image.png

    在这里,如果直接使用 run()方法 就是顺序执行,是单线程。

    image.png

    我们可以从输出中看到,程序是先执行完了my1.run才执行的my2.run

    image.png

    我们可以改为start(),方法来启动多线程。

    4,设置和获取线程的名称

    image.png

    有时候我们线程在运行的时候,我们并不懂它是哪个线程的。所以我们需要通过获取线程名称来知道线程的类型。

    image.png

    image.png

    这样我们输出的值,就会显示是哪个线程的了

    除了得到线程的名字之外,我们还可以设置线程的名字。

    image.png

    关于调用线程的名字,我们可以从上往下分析。

    第一个方法赋值给第二个构造方法,第二个构造方法赋值给第三个构造方法

    image.png

    或者在这里,我们重写构造方法,给构造方法传入一个String类型的name变量。

    image.png

    image.png

    这样参数就可以一步步传递到Thread类中。


    线程调度
    image.png

    image.png

    image.png

    image.png


    image.png

    join()方法

    如果有个线程调用了,join()方法,那么其他线程只有等待这个线程执行完毕,才会继续调用。

    image.png

    join()就是等线程结束之后才会开始其他的线程。

    image.png

    Daemon

    image.png

    在这里,main函数调用了Thread.currentThread(),说明只有Thread对象才能使用Thread类的方法。

    image.png

    刘备执行结束之后,关羽和张飞的线程也结束了。


    线程生命周期

    image.png


    1.8实现多线程的方式____Runnable

    image.png

    image.png
    image.png

    image.png
    给线程起名字

    这里使用Runnable的接口的方法主要是为了,避免出现类继承了Thread无法继承其他类的情况。


    卖票案例分析

    image.png
    image.png

    注意,我们这里要添加:
    image.png

    sleep方法,让其他线程有时间去反应。

    这里其实是三个线程共同调用同一个方法,修改同一个参数。tickets

    image.png


    线程同步

    image.png
    如果一个代码同时满足上面的三种语句,就会出现数据安全问题。
    我们现在能够操作的只有第三种情况。——解决方法是给数据上锁

    image.png
    image.png
    image.png

    image.png


    image.png
    image.png
    image.png

    image.png

    image.png


    Lock锁

    image.png


    生产者消费者

    image.png

    image.png


    生产者和消费者案例分析

    image.png

    与多线程有关的案例分析。

    我们先写一个系统,该系统具有数据和操作数据的方法。
    现在我们还需要其他的类,来调用该对象的一些方法。并且把这些方法以多线程的形式输出。

    image.png

    其中state是状态变量,我们通过建立一个state来标记状态指示符。根据不同的状态来判断代码块是否执行。

    当我们使用wait()方法的时候,该代码块是需要被synchronized修饰的,只有同步的代码块才可以使用wait方法。

    同时当我们等待了之后,我们也一定要记得唤醒程序的代码。

    image.png
    image.png

    image.png