当前位置:网站首页>【多线程】Thread类的基本用法
【多线程】Thread类的基本用法
2022-08-02 23:20:00 【SPMAX】
在Java中接触线程,避免不了去使用一个类Thread类,该类是创建线程的关键,它是创建线程的前提,下面介绍一些有关Thread类的基本用法。
一:线程的创建:
第一种,通过重新写一个Mythread类,通过向上转型的方式继承Thread类,并重写run方法:
第二种,通过重新写一个Myrunnable类,然后继承Runnable接口,重写run方法,然后在main线程里面创建Thread类,然后实例化Myrunnable对象,作为参数传入新创建的Thread类:
第三种,通过Thread实例化时候创建匿名内部类的方式来新建线程,并且重写run方法
第四种,通过匿名内部类的方式实例化Runnable并重写run方法,将其作为参数传入给Thread线程。
第五种,实例化Thread类的时候传入参数new Runnable类并重写run方法:
第六种,通过lambda表达式来创建Thread线程:
注意此时不需要重写run方法,而是直接在里面写需要执行的任务。
注意区分Thread.run和Thread.start 区别:
二者都是Thread类里面的方法,但是run方法作用只是执行任务,可以通过实例化Thread类然后调用该方法执行任务,但是start方法作用是开启一个新的线程,这里的新线程是与main线程同级作为前台线程,二者都执行完了该程序进程才算执行完成。
因此run与start区别可以概括为:start开启了新的线程,进而执行新线程里面的任务
而run只是一个类里面的普通的方法,可以通过平常调用类中方法的方式来调用该方法,并没有启动新的线程。
二、线程的休眠:
线程的休眠,即通过调用Thread.sleep()方法来进行,括号里面的放入数字,单位为ms(毫秒)即1000ms=1秒。通过sleep进行休眠后,线程发生阻塞,即线程中的PCB(这里PCB可以和线程作为相等的来理解)从就绪队列(随时可以被操作系统的调度器调用)放入至阻塞队列(不能被操作系统的调度器进行调用),这两个队列为双向链表。在sleep执行完之后,PCB就从阻塞队列加入进就绪队列,但是由于操作系统的调度器调用是随机调用(根据操作系统对资源的开销进行随即调用),所以即使将从阻塞队列放回就绪队列,依然不一定立刻就执行该线程,因为随机调用的机制,不一定立刻从就绪队列找到该线程进行执行,但是会依然会执行,只不过晚一点点,误差不超过10ms。
三、线程的中断
线程的中断是通过线程的标记来执行:通过两个方法:
1:Thread.currentThread().isInterrupted 获取线程的标记
2:Thread.interrupted获取线程标记
这两个都是放在run方法里面来获取线程的标记,
线程在执行状态则二者都返回true,若在阻塞状态则返回false,便于在该线程以外的线程例如main线程对新线程进行控制,控制规则为:
1>当新线程为执行状态,在新线程外调用Thread.interrupt()方法,将新线程标记从true改为false,
2>当新线程为阻塞状态,在新线程外调用Thread.interrupt()方法,则新线程所执行的方法会抛出异常,例如新线程正在调用sleep()方法进行阻塞,此时在新线程外调用interrupt()方法,此时sleep()方法会抛出异常,便于利用try-catch进行捕获进行下一步对新线程的操作。
边栏推荐
- Technology Sharing | How to do assertion verification for xml format in interface automation testing?
- js基础知识整理之 —— 判断语句和三元运算符
- No code development platform data ID introductory tutorial
- d合并json
- Rasa 3.x 学习系列- Rasa - Issues 4792 socket debug logs clog up debug feed学习笔记
- WAF WebShell Trojan free to kill
- 如何使用vlookup+excel数组公式 完成逆向查找?
- 服务间歇性停顿问题优化|得物技术
- 用了 TCP 协议,数据一定不会丢吗?
- 基于两级分解和长短时记忆网络的短期风速多步组合预测模型
猜你喜欢
随机推荐
C语言函数详解(2)【函数参数——实际参数(实参)&形式参数(形参)】
在软件测试行业近20年的我,再来和大家谈谈今日的软件测试
用大白话解释“什么是ERP?” 看完这篇就全明白了
D with json
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping的区别
谷歌 Chrome 浏览器 104 正式版发布:加快网页加载,蓝牙 API 改进
Connect the Snowflake of CKAN tutorial CKAN to release to open data portal
Directing a non-relational database introduction and deployment
HVV红队 | 渗透测试思路整理
Rebound shell principle and implementation
我为什么又能面试一次就拿到offer
d实验新异常
2022暑假牛客多校1 (A/G/D/I)
Image recognition from zero to write DNF script key points
微信小程序(一)
NLP常用Backbone模型小抄(1)
公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了
【代码扫描修复】MD5加密弱HASH漏洞
Find My技术|智能防丢还得看苹果Find My技术
程序员如何优雅地解决线上问题?