首页 > 其他分享 >线程创建方式、构造方法和线程属性

线程创建方式、构造方法和线程属性

时间:2024-03-28 23:03:01浏览次数:16  
标签:run 构造方法 Thread void start 线程 public 属性

欢迎各位!!!推荐PC端观看

文章重点:学会五种线程的创造方式

目录

1.开启线程的五种方式

2.线程的构造方法

3.线程的属性及获取方法


1.开启线程的五种方式

创造线程的基本两步:(1)使用run方法记录线程要做的任务(2)使用线程的引用 调用start开启线程

1.1.继承Tread,重写run
class myThread extends Thread {
    @Override
    public void run() {
        System.out.println("继承Thread,重写run");
    }
}
public class Func1 {
    public static void main(String[] args) {
        Thread t = new myThread();
        t.start();
    }
}

(1)Thread线程自己在run中记录了线程要做的任务

(2)main函数中通过t引用开启线程

1.2.实现Runnable,重写run
class myRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("实现Runnable,重写run");
    }
}
public class Func2 {
    public static void main(String[] args) {
        myRunnable t = new myRunnable();
        Thread t2 = new Thread(t);
        t2.start();

    }
}

(1)实现Runnable接口,此时记录任务的是一个单独的类

(2)t开启线程之和,线程需要到前面的类中寻找线程任务

(3)相比第一种来说,安全性更高

1.3.继承Thread,使用匿名内部类

第一种写法的变形

 public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run() {
                System.out.println("继承Thread,使用匿名内部类");
            }
        };
        t.start();
    }

1.4.实现Runnable,使用匿名内部类

第二种写法的改进写法

 public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("实现Runnable,使用匿名内部类");
            }
        });
        t.start();
    }

1.5.使用lambda表达式

 public static void main(String[] args) {
       Thread t= new Thread(()->{
           System.out.println("使用lambda表达式执行线程");
       });
       t.start();
    }

线程创造方式的推荐:第五种>第四种>三>二>一

1.6.查看多线程运行

6.1.直接通过代码观察

代码:

class myThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println("t线程ttttt");
        }
    }
}
public class demo1 {

    public static void main(String[] args) {
        Thread t = new myThread();
        t.start();
        while (true) {
            System.out.println("主线程9999");
        }
    }
}

运行结果:

6.2.通过jconsole.exe观察

(1)找到该文件位置

(2)运行代码后选择

(3)可以看到,此时线程正在运行。Thread-0就是我们自己创造的t线程,main线程是主线程,运行程序就会有

1.7.线程小结

(1)按照上面五种方式创建完线程之后,需要通过线程的引用开启线程。例如 t 就是一个线程引用,t.start()就是开启了该线程,后面会介绍该方法。

(2)前面的四种线程创造方法,都需要重写run,而使用lambda表达式不需要。其本质都是为了记录该线程的任务。等待t.start()后就会执行该任务

 

2.线程的构造方法

下面是一个Thread线程构造函数表

2.1.Thread()

这种构造方法,就是我们上面使用的第一种创造线程的方法,但是要发生向上转型,一般不会直接new;也可以是第五种

2.2.Thread(Runnable target)

这种也就是上述的第二种线程创造方式和第四种

(1)上述第二种

(2)上述第四种

 2.3.Thread(String name)

这种是给线程起名字

(1)没有给线程起名字时

当我们自己创建的线程没有起名字时,第一个线程默认为:Thread-0,第二个为:Thread-1,以此类推

(2)起了名字后

起名字的写法一般是后面几种创造线程的方式才可以

3.线程的属性及获取方法

下面是Thread常见的几个属性和获取方法

这里线程的一些属性,有些neri

3.1.ID

这里的id和pcb中的id不是同一个东西,但是都是唯一标识符。而且,在java代码中是无法获取到该属性,所以也就不过多叙述了。

3.2.名称

这里的名称也就是可以通过上面介绍的构造方法设置的。

通过getName()方法就可以找到该线程的名字

3.3.状态

线程的状态有五种:新建状态(NEW)、就绪状态(RUNNABLE)、运行状态(RUNNING)、阻塞状态(BLOCKED)、死亡状态(DEAD)

至于每种状态代表什么、是怎么来的、状态之间是怎么切换,我们这里不做介绍,后面会有专门一部分来叙述。

获取当前线程的状态:

3.4.优先级

实际上修改了优先级,但是现象也不明显。所以这里的修改优先级仅供参考,也就不做其他详细的介绍

3.5.是否后台线程(*)

(1)介绍后台线程和前台线程

前台:如main所在的主线程,前台线程不运行结束的话,java进程一定不会结束。而且前台线程有很多个,只有都结束了,Java程序才会结束

后台:这样的线程 对进程不起决定作用(也称为daemon,后台线程)

我们创造的线程和主线程都默认是前台线程。

(2)举例子说明前后台程序

举办酒席:主持人、官方人员和主人这些,我们记为前台程序;而像我们这些干饭人则称为后台线程。酒席是否结束我们就记为Java程序是否结束

(1)我们这些干饭人,吃完饭就直接走,不会影响酒席的结束与否

(2)当主持人这些前台程序宣布酒席到此结束的时候,酒席就会直接结束。即使干饭人的我没有吃完,也不能继续干饭了(后台程序也结束了)

(3)通过setDaemon方法可以把线程设置为后台线程

方法内默认加上true

如果不把t线程设置为后台线程,该程序是不会结束的 

(4)注意事项

线程的各种属性设置都要在start前面,否则报错

3.6是否存活(*)

 (1)是否存活:指的是系统中的线程(PCB)是否存在。而Thread对象的生命周期,和PCB的生命周期是不一定完全一样的。

(2)区别

他们的诞生的时间:

当线程创建出来的时候,pcb才会出现并且添加到链表上 

他们的结束的时间:

t线程一下子就执行完了,因此pcb的一下子就结束了;而t指向的Thread对象,因为sleep还没执行完,因此还没被GC回收

他们的第二种结束时间:

这种写法,t线程里面会休眠一段时间才会结束,而Thread对象一下子就被GC回收了。

结论:说明他们之间没有什么关系,无法真正的判断线程是否结束了,所以可以通过isAlive()方法判断当前的线程是否还存货。

(3)判断线程是否存活

因为上面的情况,Thread对象和线程的生命周期不完全一样,所以不容易直接判断,就需要借助一些方法来获取当前线程的属性-是否存活

1)线程未结束

2)线程已结束

3.7是否被中断

这里只简单的查看一个线程是否被中断,至于如何中断一个线程,在后面介绍线程的核心操作部分介绍。

(1)查看一个死循环线程

(2)有限线程 

这种判断,即使一个线程自己结束了,也显示false


上面的重点是:五种线程的创建方式、给线程起名字、是否后台线程、是否存活这些等等;而线程的状态、是否被中断,在接下来的文章中重点介绍。

标签:run,构造方法,Thread,void,start,线程,public,属性
From: https://blog.csdn.net/2301_77053417/article/details/137079435

相关文章

  • WPF绑定之道:为何选择属性而非字段,提升灵活性与可控性
     概述:WPF支持绑定到对象的属性而不是字段,主要因为属性提供了更多控制和扩展性。属性包含get和set方法,支持数据验证和通知属性更改,而字段通常被认为是内部实现。使用属性使WPF能够更灵活、可控地与数据交互,提高代码的可读性和可维护性。WPF(WindowsPresentationFoundation)支......
  • 【CSS浮动属性】别再纠结布局了!一文带你玩转CSS Float属性
    在网页设计的世界里,CSS浮动属性(float)就像一把双刃剑。它能够让元素脱离文档流,实现灵活的布局,但如果处理不当,也可能引发一系列布局问题。今天,我们就来深入探讨这把“剑”的正确使用方法,让你的页面布局既美观又稳定。一、什么是CSS浮动属性浮动属性是CSS中的一个定位属性,它允许元......
  • top命令找到占用CPU最高的java线程
    1、使用jps查找正在运行的java进程2、通过使用top命令查找该线程下CPU使用最高的线程top-Hppid:即  top-Hp2860 3、TIME列就是各个Java线程耗费的CPU时间,显然CPU时间最长的是ID为2968的线程,用printf"%x\n"2968可得到2968的十六进制值为:b984、终于轮到jsta......
  • vue实例的data属性,可以在哪些生命周期中获取到
    Vue实例的data属性可以在beforeCreate、created和beforeMount生命周期中获取到。在Vue实例的生命周期中,data属性在不同的阶段有着不同的可访问性:beforeCreate:在实例初始化之后,数据观测(dataobserver)和事件配置之前被调用。在这个阶段,data属性已经可以被访问,但是事件监听器......
  • Ant Design 设置必填属性的一个坑!Objects are not valid as a React child (found: ob
    1、刚开始,我是用第一种方式。通过一个变量,来设置必填属性的提示值 显示是没有问题的。但是点击ModalForm确认按钮时,报错ObjectsarenotvalidasaReactchild(found:objectwithkeys{requiredMsg}).Ifyoumeanttorenderacollectionofchildren,useanarray......
  • "线程池中线程异常后:销毁还是复用?"
    一、一个线程池中的线程异常了,那么线程池会怎么处理这个线程?需要说明,本文的线程池都是java.util.concurrent.ExecutorService线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。二、代码验证2.1验证execute提交线程池中2.1.1测试代码:publicclassThreadPoolEx......
  • java线程池原理浅析
     问题:查询大数据量的时候,例如一次返回50w数据量的包,循环去查询发现读取会超时。解决方案:经过思考采用多线程去分页查询。使用线程池创建多个线程去查询分页后的数据最后汇总一下,解决了一次查询大量数据返回超时的问题。一次查询现状:  多线程分页查询改造图: ......
  • 线程池的介绍与实现(多线程代码案例)
    目录概念:ThreadPoolExecutorintcorePoolSizeintmaximumPoolsizelongkeepAliveTimeTimeUnitunitBlockingQueuewokrQueueThreadthreadFactoryRejectedExecutionHandlerhandler1.ThreadPoolExecutor.Abortpolicy2.ThreadPoolExecutor.CallerRunsPolicy3.Thre......
  • IRIS / Chronicles 定义 Item 中的 Add Type 属性
    根据我们前面说的Item中的AddType属性,这个主要用来标识输入的数据是不是随着时间的变化而变化,有下面3种选项。No‐Add这个就是当数据输入后,是不会再变化了,不会随着时间的变化而变化。ResponseEachTime这个就是每次在数据在创建的时候都有可能会变化。比如说体重,当你......
  • IRIS / Chronicles 中的 Data Type(数据类型)字段型属性
    IRIS的数据类型比较少,也就4个数据类型:字符串,数字,时间,分类。在这里分类有点像我们的下拉选择框,其实对应Java或者其语言中的数据来说可以说是枚举类型。只是IRIS的枚举类型是定义在数据库中的,并且是事先定义好的。String这个好说,就是字符串。因为M语言的限制,所以Stri......