【Java 11】多线程 - 程序、进程、线程、线程的创建和使用、线程的生命周期、线程的同步、线程的通信、JDK5.0新增线程创建方式

本文深入探讨Java 11中的多线程概念,包括程序、进程和线程的区分,线程的创建(继承Thread、实现Runnable和JDK5.0新增的Callable接口)、线程调度与优先级,线程同步(同步代码块、同步方法和Lock),线程通信(wait、notify和notifyAll)以及线程池的使用。此外,还讨论了不同线程创建方式的优缺点和线程安全问题。
摘要由CSDN通过智能技术生成

一 Idea

1 快捷补全

  • new Method()

    使用Alt + Enter 可补全

    Method method = new Method();

  1. psvm : 可生成 main 方法

  2. sout : System.out.println() 快捷输出

    soutp=System.out.println("方法形参名 = " + 形参名); soutv=System.out.println("变量名 = " + 变量); soutm=System.out.println(“当前类名.当前方法”); “abc”.sout => System.out.println(“abc”);

  3. fori : 可生成 for 循环

    iter:可生成增强 for 循环

    itar:可生成普通 for 循环

  4. list.for : 可生成集合 list 的 for 循环

    List list = new ArrayList();

    输入: list.for 即可输出

    for(String s:list){ }

    又如:list.fori 或 list.forr

  5. ifn:可生成 if(xxx = null)

    inn:可生成 if(xxx != null) 或 xxx.nn 或 xxx.null

  6. prsf:可生成 private static final

    psf:可生成 public static final

    psfi:可生成 public static final int

    psfs:可生成 public static final String

image-20200816141319453

image-20200816141338639

外加:

*
 * @description: <br>
 * @param: $param$
 * @return: $return$
 * @author: $user$
 * @date: $date$ $time$
 */

image-20200816145629807

image-20200816145646019

二 线程

image-20200816150230959

1 程序、进程、线程

image-20200817090635250

image-20200817091001029

image-20200817093629374

image-20200817093729667

2 线程的创建和使用

image-20200817094120325

2.1 多线程的创建

2.1.1 方式一:继承Thread类
2.1.1.1 步骤
  1. 定义子类继承Thread类

  2. 子类中重写Thread类中的run方法 —> 将此线程执行的操作声明在run()中

  3. 创建Thread子类对象,即创建了线程对象

  4. 通过此线程对象 调用 start()方法:启动线程,调用run方法

public class ThreadNew {
   
    public static void main(String[] args) {
   
        
        //3.创建Thread子类对象,即创建线程对象
        MyThread01 mt = new MyThread01();
        //4.调用线程对象start方法:启动线程,调用run方法
        mt.start();
        //new MyThread01().start();
        
    }
}

//1.定义子类继承Thread类
class MyThread01 extends Thread {
   
    
    //2.子类中重写Thread类中的run方法
    @Override
    public void run() {
   
        System.out.println("-----MyThread01");
    }
    
}
2.1.1.2 start()方法的作用
  1. 启动当前线程
  2. 调用当前线程的run()
2.1.1.3 一些问题

问题一:我们不能通过直接调用run()的方式启动线程

问题二:再启动一个线程,不可以还让已经start()的线程去执行。会报IllegalThreadStateException异常

2.1.1.4 步骤整合
new Thread(){
   
    @Override
    public void run(){
   
        
    }
}.start();
2.1.1.5 Thread类常用方法

image-20200817112956354

image-20200817113006290

  1. void start():启动当前线程;调用当前线程的run()

  2. run():线程在被调度时执行的操作。通常需要重写Thread类中的方法,将创建的线程要执行的操作声明在此方法中

  3. static Thread currentThread():静态方法,返回执行当前代码的线程【在Thread子类中就 是this】

    【Thread.currentThread().getName()= mt.getName()】

  4. String getName():获取当前线程的名字

  5. void setName():设置当前线程的名字

  6. static void yield():线程让步。释放当前CPU的执行权

    暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程

    若队列中没有同优先级的线程,忽略此方法

  7. join():当线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态。

    低优先级的线程也可以获得执行

  8. static void sleep(long millitime):让当前线程“睡眠”指定millitime毫秒。在指定的millitime毫秒时间内,线程是阻塞状态

  9. stop():强制线程生命期结束,不推荐使用

  10. boolean isAlive():返回boolean,判断线程是否还活着

2.1.1.6 Thread类构造器
  1. Thread():创建新的Thread对象
  2. Thread(String threadname):创建线程并指定线程实例名
  3. Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接 口中的run方法
  4. Thread(Runnable target, String name):创建新的Thread对象
2.1.2 方式二:实现Runnable接口
2.1.2.1 步骤
  1. 定义子类,实现Runnable接口

  2. 子类中重写Runnable接口中的run()方法

  3. 创建实现类的对象

  4. 将Runnable接口的子类对象 作为实际参数 传递给 Thread类的构造器中

  5. 通过Thread类的对象去调用start()方法

    【开启线程,调用Runnable子类接口的run方法】

    【调用了Runable类型的target的run()方法】

    Thread.java
     
    public class Thread implements Runnable{
          
     
     private Runnable target;
     
     public Thread(Runnable target){
          
         init(null; target; "Thread-" + nextThreadNum(), 0);
     }
     
     public void run(){
          
     	if(target != null){
          
      	   target.run();
     	}
    	}
     
    }
    
public class ThreadTest02 {
   

    public static void main(String[] args) {
   

        //3.创建实现类的对象
        MyThread02 myThread02 = new MyThread02();
        //4.将Runnable接口的子类对象 作为实际参数 传递给 Thread类的构造器中
        Thread t2 = new Thread(myThread02);
        //5.通过Thread类的对象去调用start()方法
        t2.start();
        
    }

}

//1.定义子类,实现Runnable接口
class MyThread02 implements Runnable {
   
    //2.子类中重写Runnable接口中的run()方法
    @Override
    public void run() {
   
        System.out.println("-----MyThread02");
    }
}
2.1.2.2 步骤整合
new Thread(new MyThread02()).start();
2.1.3 比较两种方式

**开发中:优先选择:**实现Runnable接口的方式

原因

  1. 实现的方式没有类的单继承性的局限性
  2. 实现的方式更适合来处理多个线程有共享数据的情况

联系

public class Thread implements Runnable

相同点:

两种方式都需要重写run(),将线程要执行的逻辑声明在run()中

2.2 线程的调度

image-20200817112545738

2.3 线程的优先级

image-20200817112842456

默认优先级:NORM_PRIORITY:5

2.4 线程的分类

image-20200817114225420

3 线程的生命周期

image-20200817160333516

image-20200817160449922

4 线程的同步

image-20200818083211502

image-20200818084622935

image-20200818095814933

image-20200818095824165

image-20200818095829926

image-20200818095835442

Java对于多线程的安全问题提供了专业的解决方式:同步机制(关键字:Synchronized


好处:同步的方式,解决了线程的安全问题

局限性:操作同步代码时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值