(JAVA)-多线程的生命周期和成员方法

2023-12-21 16:04:37

?

?线程的生命周期

1.新建状态:创建线程对象

2.就绪状态:调用start()方法后,有执行资格没有执行权(抢夺cpu执行权)

3.运行状态:抢到了cpu执行权,运行代码,当cpu执行权被抢走,又回到就绪状态

4.死亡状态:当run方法的内容全部执行完,线程就会死亡,变成垃圾

5.阻塞状态:当遇到sleep或者其他阻塞方法,线程就会等着,没有执行资格也没有执行权

,当sleep的时间到了或者其他阻塞方式结束,又会回到就绪状态。

细节:

1.没给线程设置名字线程也有默认的名字格式Thread-x(x为序号,从0开始)

2.jvm虚拟机启动后会启动多条线程,其中有一条线程就是main线程,作用是调用main方法,并执行里面的代码

3.sleep方法:哪个线程执行到这个方法就会停留对应的时间

?线程的调度

1.抢占式调度:多个线程抢占cpu的执行权,具有随机性

2.非抢占式调度:线程轮流执行

jvm中线程的调度是抢占式调度,优先级越高,抢到cpu的概率越大,Java中的线程分为10档,最低是1,不设置默认是5.

?守护线程

fianal void setDaeom(boolean on)

细节:当非守护线程结束了,守护线程也会陆续结束

    public static void main(String[] args) {
        //1.自己定义一个类继承Thread
   MyThread t=new MyThread();
   MyThread1 t1=new MyThread1();
        t.setName("线程1");
        t1.setName("线程2");
      t.setDaemon(true);//将线程1设置为守护线程
   t.start();
   t1.start();

    }


//线程1
 class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName()+"hello");
        }
    }


//线程2
class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName()+"hello");
        }
    }
}

细节:

1.我们可以看到,当非守护线程结束后,守护线程没有立马结束,会运行一小段时间,因为在线程退出的一瞬间,守护线程会抢到一小会cpu执行权

2.thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出一个IllegalThreadStateException异常。

3.正在运行的常规线程不能设置为守护线程。

4.多个线程同时运行,守护线程会等所有线程都运行完停止。

礼让线程

public static void yield()

表示出让当前CPU执行权,从运行状态进入就绪状态

此方法跟sleep方法有点像

关于sleep()方法和yield()方的区别如下:

1.sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态;而yield方法调用后 ,是直接进入就绪状态,完全可能马上又被调度到运行状态。

2.sleep 方法会给其他线程运行的机会,但是不考虑其他线程优先级的问题;而yield 方法会优先给更高优先级的线程运行机会。

3.sleep方法声明抛出了InterruptedException,所以调用sleep方法的时候要捕获该异常,或者显示声明抛出该异常。而yield方法则没有声明抛出任务异常。

public class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(i+getName()+"hello");
            Thread.yield();
        }
    }
}

能尽量让执行结果均匀一点

插入线程

public final void join();
  t.join();
        for (int i = 0; i < 100; i++) {
            System.out.println(i+"主线程结束");
        }

表示把t线程插入在当前线程之前完成。

文章来源:https://blog.csdn.net/fdvvg/article/details/135094145
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。