JavaWeb——多线程的五种创建方法(继承Thread类、匿名内部类、Runnable接口、匿名内部类重写runnable、lambda表达式),Thread类的常见构造方法、属性

线程创建

一个进程包含一个主线程main,如果要新建线程就需要,使用线程中的start()方法,此时内核中出现了一个pcb对象,这个pcb就会让cpu执行对应的代码,

继承Thread类

创建线程需要使用Thread 类,来创建一个Thread 的实例,另一方面还需要给这个线程指定,要执行哪些指令/代码,指定指令的方式有很多种方式,此处先用种简单的,直接继承 Thread 类,重写Thread类中的run方法.

public class Create {
    static class MyThread extends Thread{
        @Override
        public void run() {
            System.out.println("我是一个线程");
            while (true){
            }
        }
    }
    //创建线程需要使用Thread 类,来创建一个Thread 的实例,
    //另一方面还需要给这个线程指定,要执行哪些指令/代码.
    //指定指令的方式有很多种方式,此处先用种简单的,直接继承 Thread 类,
    //重写Thread类中的run方法.
    public static void main(String[] args) {
        //当Thread对象创建出来的时候内核中并没有随之产生一个线程
        MyThread myThread = new MyThread();
        //执行了start()方法才会创建一个新线程,此时内核中出现了一个pcb
        //这个pcb就会让cpu执行对应的代码,例如上面的run方法
        myThread.start();
        while (true){
        }
    }
}

在这里插入图片描述

通过匿名内部类方式继承Thread类

在这里插入图片描述

public class Create1 {
    //匿名内部类
    //创建了一个没有名字的类,只知道这类继承自Thread{}中是这个类的具体代码
    //同时也会new出这个类的实例
    Thread t = new Thread() {
        @Override
        public void run() {
            System.out.println("我是一个线程");
            while (true){
            }
        }

    };
    public static void main(String[] args) {
        //当Thread对象创建出来的时候内核中并没有随之产生一个线程
        Create1 create1 = new Create1();
        create1.t.start();
        //执行了start()方法才会创建一个新线程,此时内核中出现了一个pcb
        //这个pcb就会让cpu执行对应的代码,例如上面的run方法
        while (true){

        }
    }
}

显式创建一个类实现Runnable接口,然后把这个Runnable的实例关联到Thread实例上

在这里插入图片描述

public class Create2 {
    //显示创建一个类实现Runnable接口
    //然后把这个Runnable的实例关联到Thread实例上
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println("我是一个新线程");
        }
    }

    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();
    }

}

使用匿名内部类去重写runnable里的run方法来创建线程

在这里插入图片描述


public class Create3 {
        public static void main(String[] args) {
            //通过匿名内部类实现Runnable接口
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("我是一个新线程");
                }
            };
            Thread t = new Thread(runnable);
            t.start();
        }

    }


使用lambda表达式

在这里插入图片描述

public class Create4 {
    public static void main(String[] args) {
        //使用lambda表达式来指定线程执行的内容
        Thread t = new Thread(()-> {
            System.out.println("我是一个新线程");
        });
        t.start();
    }
}

操作系统
都一样
在细节上有点区别.
通过Runnable / lambda的方式来创建线程和继承Thread类相比,代码耦合性要更小一些在写Runnable或者lambda的时候run中没有涉及到任何的Thread相关的内容.
这就意味着很容易把这个逻辑从多线程中剥离出来,去搭配其他的并发编程的方式来执行.当然也可以很容易改成不并发的方式执行.

start和run方法

start()
是要创建一个新的线程,由新的线程来执行输出.
run()
只是一个普通的方法调用.没有创建新的线程.输出语句是在原线程中执行的.

查看线程

在这里插入图片描述
选择本地连接,选刚刚创建的类,之后连接,因为是本地的,不与其他的进行交互所以后面选不安全连接。
在这里插入图片描述
之后就可以进行查看
在这里插入图片描述

Thead常见构造方法

在这里插入图片描述

Thread 的几个常见属性

在这里插入图片描述
ID 是线程的唯一标识,不同线程不会重复
名称是各种调试工具用到
状态表示线程当前所处的一个情况
优先级高的线程理论上来说更容易被调度到
关于后台线程,需要记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行。
是否存活,即简单的理解,为 run 方法是否运行结束了

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread("hh"){
            @Override
            public void run() {
                for (int i = 0; i < 10 ; i++) {
                    System.out.println(Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //run方法的执行过程就代表着系统内线程的生命周期
                //run方法执行中,内核的线程就存在
                //run方法执行完毕,内核中的线程随之销毁
                System.out.println("线程退出");
            }
        };
        //只要线程创建完毕,属性不变
        System.out.println(t.getName());
        System.out.println(t.getPriority());
        System.out.println(t.isDaemon());
        System.out.println(t.getId());
        //会随着线程的运行过程发生变化
        System.out.println();
        System.out.println(t.isAlive());
        System.out.println(t.isInterrupted());
        System.out.println(t.getState());

        t.start();
        while (t.isAlive()){
            System.out.println("hh 正在运行");
            System.out.println(t.getState());
            System.out.println(t.isInterrupted());
            Thread.sleep(300);

        }
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/char_m/article/details/106663040