java多线程

    xiaoxiao2021-04-17  41

    一、概念开始:

    1、进程:

    1)直译:正在进行中的程序

    2)解释:执行一个程序时,会在内存中为程序开辟空间,这个空间就是一个进程。

    3)注意:一个进程中不可能没有线程,进程只是开辟一个空间,并不执行,执行的是线程。

    2、线程:

    1)定义:就是进程中一个负责执行的控制单元(执行路径)

    2)注意:一个进程中可以有多个执行路径,成为多线程;一个进程中至少有一个线程

    3、任务:

    开启多个线程,是为了同时运行多个内容,这个内容就是任务

    二、多线程的初步认识

    jvmjava虚拟机)中的多线程解析:jvm启动时,就启动了多线程。其中至少有两个线程,执行main函数的主线程和负责垃圾回收的线程

    解释:在执行main函数中任务的时候,会开启一条线程,当运行垃圾越来越多,又会有垃圾回收任务,所以垃圾回收线程开启。其中,main方法任务的代码都定义主函数代码中。

    三、线程的创建

    1、继承Thread类创建多线程

    1)创建类继承Thread

    2)覆盖Thread类中的run()方法,将线程任务封装到run

    代码实例:

    publicclass ThreadDemo2 extends Thread {    //覆盖父类的run方法    publicvoid run() {       //运行任务       show();    }    public  void show() {       for(inti=1;i<10;i++){          System.out.println(i+super.getName());       }    } }

    //调用

    Threadthread = new ThreadDemo2(); Threadthread2 = new ThreadDemo2(); thread.start(); thread2.start();

    2、实现Runnable接口创建多线程

    1)定义Runnable类实现接口

    2)覆盖Runnable接口中run()方法,将线程的任务封装到run

    3)通过Thread类创建线程对象,并将接口的子类对象作为Runnable类的构造函数进行传递

    4)调用线程对象的start方法开启线程

    注意:为什么要有(3)步骤呢?因为,线程的任务都是封装在Runnable接口子类对象的run()方法中。

    代码实例:

    publicclass RunnableDemo implements Runnable{    @Override    publicvoid run() {       show();    }    publicstaticvoid show(){       System.out.println("1");    } }

    调用:

    RunnableDemorunnableDemo = new RunnableDemo(); Threadthread3 = new Thread(runnableDemo); Threadthread4 = new Thread(runnableDemo); thread3.start(); thread4.start();

     

    四、多线程的生命周期

    1、新建状态:使用new创建一个线程后,在调用start方法前,该线程只是一个空线程,只具备的一些特性,系统还未为其分配资源

    2、就绪状态:调用start()方法后,系统为其分配除cpu之外的所需资源。此外,当处于运行时的线程调用了yield()方法,那么该线程会被暂时剥夺cpu资源,重新进入就绪状态

    3、运行状态:Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。可以通过Thread类的isAlive方法来判断线程是否处于就绪/运行状态:当线程处于就绪/运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于阻塞状态,也可能处于停止状态。

    4、阻塞状态:一个正在运行的线程因某些原因不能继续运行时,就进入阻塞状态。

    这些原因包括:

    1)当执行了某个线程对象的sleep()等阻塞类型的方法时,该线程对象会被置入一个阻塞集内,等待超时而自动苏醒。

    2)当多个线程试图进入某个同步区域时,没能进入该同步区域的线程会被置入锁定集,直到获得该同步区域的锁,进入就绪状态。

    3)当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。

    5、死亡状态:线程在执行完run()方法后进入死亡状态。此外,如果线程执行了interrupt()stop()方法,那么它也会以异常退出的方式进入死亡状态

     

    注:终止线程的三种方法:

    1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用

    2)使用stop方法强制终止线程(这个方法不推荐使用,因为stopsuppendresume一样,也可能发生不可预料的结果)

    3)使用interrupt方法终端线程

    转载请注明原文地址: https://ju.6miu.com/read-674322.html

    最新回复(0)