线程

发布时间 2023-08-14 21:01:17作者: PHOEDE

1、多线程

    1.1 线程与进程

      · 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序基本单位;系统运行一个程序即是一个进程从创建,运行到消亡的过程。

      · 线程:线程是进程中的一个执行单元,负责当前进程中的执行,一个进程中至少有一个线程。一个进程中是可以多个线程的,这个应用程序也可以称之为多线程程序。

    1.2创建线程类

      Java 使用 Thread 类代表 线程 ,所有的线程对象都必须是Thread类或其子类的实列。每个线程的作用是完成一定的任务,实际就是执行一段程序流即一段顺序执行的代码

      1、定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表线程需要完成的任务,因此把run()方法称为线程执行体。

      2、创建Thread子类的实例,即创建了线程对象

      3、调用线程对象的start()方法来启动该线程

    

2、多线程详解

      2.1 Thread类

        构造方法:

        · public Thread() : 分配一个新的线程对象

        · public Thread( String name) : 分配一个指定名字的新的线程对象。

        · public Thread( Runnable target) : 分配一个带有指定目标的新线程对象。

        · public Thread( Runnable target,String name) : 分配一个带有指定目标的新线程对象并指定名字。

        常用方法:

        · public String getName() : 获取当前线程名称。

        · public void start() : 导致此线程开始执行;Java虚拟机调用此线程的run方法。

        · public void run() : 此线程要执行的任务在此处定义代码。

        · public static void sleep(long millis) : 使用当前正在执行的线程以指定的毫秒数暂停。

        · public static Thread currentThread() : 返回对当前正在执行的线程对象的引用

        

      测试类:

      

      自定义线程类:

      

      运行:

          

      2.2 Runnable类

          Runnable 也是非常常见的一种,我们只需要重写run方法即可。

          1、定义Runnable 接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程执行体。

          2、创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Theater对象才是真正的线程对象。

          3、调用线程对象的start()方法来启动线程。

            代码如下:

              

 

 

            

      3、线程安全

            如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的
        而且其他的变量的值也和预期的是一样的,就是线程安全的。

        实体类:

          

        测试类:

          

        运行结果:

          

        1、同样的票数,比如98这张票被卖了两次

        2、不存在的票,比如0票-1票,是不存在的

        这个问题,几个窗口(线程)票数不同步了,这种问题称为线程安全性问题。

      4、线性安全问题解决方法

        -- synchronized

          · 同步代码块:synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问

          对于非static方法,同步锁就是this

          对于static方法,我们使用当前方法所在类的字节码对象(类名.Class)

          格式:

            

 

        

 

      -- Lock锁

        Lock机制提供了比 synchronized 代码块和 synchronized 代码块和 synchronized 方法更广泛的锁定操作,同步代码/同步方法具有的功能

        ·public void lock() : 加同步锁

        ·public void unlock() : 释放同步锁