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

news2024/12/30 2:03:14

欢迎各位!!!推荐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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++取经之路(其二)——含数重载,引用。

含数重载: 函数重载是指:在c中,在同一作用域,函数名相同,形参列表不相同(参数个数,或类型,或顺序)不同,C语言不支持。 举几个例子: 1.参数类型不同 int Add(int left, int right)…

白盒测试、接口测试、自动化测试详解

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是白盒测试 白盒测试是一种测试策略,这种策略允许我们检查程序的内部结构&…

NEO 学习之 MLE(最大似然估计)

文章目录 简单题目MLE 在不同的分布的运用正态分布指数分布均匀分布泊松分布 简单题目 此题问的是求丢色子,求得到偶数点的概率 求两次都得到硬币的背面的概率 拿球问题 符合的点数是 1,5,6 MLE 在不同的分布的运用 正态分布 对于给定的数据集 {1, 3, 4, 6, 7}&am…

linux:线程同步

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

Appium设备交互API

设备交互API指的是操作设备系统中的一些固有功能,而非被测程序的功能,例如模拟来电,模拟发送短信,设置网络,切换横竖屏,APP操作,打开通知栏,录屏等。 模拟来电 make_gsm_call(phon…

大数据之scala

为什么学习scala spark是新一代内存级大数据计算框架,是大数据的重要内容 spark就是使用scala编写的,因此为了更好的学习spark,需要掌握scala这门语言 spark的兴起,带动scala语言的发展 scala发展历史 联邦理工学院的马丁 奥德…

走迷宫(BFS两种写法)

题目描述: 给定一个 nm 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。 最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、…

市场复盘总结 20240328

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率中 40% 最常用的…

2024 ccfcsp认证打卡 2023 03 02 垦田计划

import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int N 100100; // 定义一个较大的常数Nlong[] t new long[N]; // 存储任务的耗时long[] c new long[N]; // 存储每块区域投入资源的数量long[] c…

SpringCloud和SpringCloudAlibaba的区别

1、SpringCloud和SpringCloudAlibaba的区别 SpringCloudAlibaba实际上对我们的SpringCloud2.x和1.x实现拓展组件功能。 nacos是分布式配置中心分布式注册中心Eurekaconfig。 研发SpringCloudAlibaba目的是为了推广阿里的产品,如果使用了SpringCloudAlibaba,最好使…

什么?想让视频号小店领先同行,竟然这么简单!

大家好,我是电商小布。 视频号小店从推出到现在,逐渐也是被越来越多的人所熟知了。 虽然说当前市场内部的商家数量并不多,竞争力不大。 但是在入驻之后想要领先同行商家,产生更好的店铺数据,该怎么来做呢&#xff1…

18.字面量

文章目录 一、字面量二、区分技巧三、扩展: /t 制表符 一、字面量 在有些资料,会把字面量说成常量、字面值常量,这种叫法都不是很正确,最正确的叫法还是叫做:字面量。 作用:告诉程序员,数据在…

【智能算法改进】混沌映射策略--一网打尽

目录 1.引言2.混沌映射3.分布特征4.混沌映射函数调用5.改进智能算法 1.引言 基本种群初始化是在整个空间内随机分布,具有较高的随机性和分布不均匀性,会导致种群多样性缺乏,搜索效率低等问题。 许多学者利用混沌映射机制来增加种群的多样性&…

国内外主要气象卫星介绍

NOAA AVHRR介绍 美国NOAA极轨卫星从1970年12月第一颗发射以来,近40年连续发射了18颗,最新的NOAA-19也将在2009年发射升空。NOAA卫星共经历了5代,目前使用较多的为第五代NOAA卫星,包括NOAA-15—NOAA-18;作为备用的第四…

17.注释和关键字

文章目录 一、 注释二、关键字class关键字 我们之前写的HelloWorld案例写的比较简单,但随着课程渐渐深入,当我们写一些比较难的代码时,在刚开始写完时,你知道这段代码是什么意思,但是等过了几天,再次看这段…

GEC6818开机自动加载驱动与更改开发板的RTC时钟

GEC6818开机自动加载驱动与更改开发板的RTC时钟 本文主要涉及: 1.GEC6818开机自动加载驱动 2.更改开发板的RTC时钟 文章目录 GEC6818开机自动加载驱动与更改开发板的RTC时钟一、开机自动加载驱动或运行程序**STEP1:** 使用vi打开文件profile.命令如下**S…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年,其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年,LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今,LinkedIn 在全球运营,拥有超过 3.5 亿会…

Portainer的替代Dockge?又一个Docker Compose管理器?

Dockge:让Docker Compose管理触手可及,一图胜千言,轻松构建与管控您的容器服务栈!- 精选真开源,释放新价值。 概览 Docker,这一开放源代码的创新平台,旨在实现应用程序部署、扩展与运维的自动化…

术语技巧:如何格式化网页中的术语

术语是语言服务中的核心语言资产。快速处理英汉对照的术语是我们在翻译技术学习过程中需要掌握的必备技能。 通常,我们需要把在权威网站上收集到的术语放到word当中,调整正左右对齐的样式,便于打印学习或者转化为Excel表。 如何快速实现这一…

docker容器下部署hbase并在springboot中通过jdbc连接

我在windows的docker中部署了一个hbase服务,然后用springboot连接到此服务并访问数据。 详情可参考项目中的README.md。项目中提供了用于构建镜像的dockerfile,以及测试代码。 项目连接: https://gitee.com/forgot940629/hbase_phoenix_sprin…