【Java基础】线程方法

start():启动线程,使线程进入就绪状态。
run():线程执行的代码逻辑,需要重写该方法。

停止线程

void interrupt() 中断线程,让它重新去争抢cpu
如果目标线程长时间等待,则应该使用interrupt方法来中断等待(强制打断,会发生中断异常InterruptedException)

static void yield() 暂停当前正在执行的线程对象,并执行其他线程

不推荐使用JDK提供的stop()、destroy()方法【已废弃】。推荐线程自己停下来,建议使用一个标志位进行终止变量,当flag=false,则终止线程运行。

package com.shan.demo7;
//测试stop
//1.建议线程正常停止————利用次数,不建议死循环
//2.建议使用标志位————设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable{//1. 设置一个标识位private boolean flag=true;@Overridepublic void run() {int i=0;while(flag){System.out.println("run……Thread"+i++);}}//2. 设置一个公开的方法停止线程,转换标志位public void mystop(){this.flag=false;}public static void main(String[] args) throws InterruptedException {TestStop testStop=new TestStop();new Thread(testStop).start();Thread.sleep(20);int i=0;while(true) {//System.out.println("main"+i++);// 主线程没有其他任务时,运行速度很快,// 很容易出现新建的线程启动后,还没有抢到CPU,// 没有运行过,程序就已经停止运行的情况// 我们可以让主线程休眠,或添加其他任务,// 来观看中止线程的效果i++;if (i==10){//调用stop方法切换标志位,让线程停止testStop.mystop();break;}}}
}

线程休眠

static void sleep(long millis) 让当前正在执行的线程休眠的毫秒数;
sleep存在异常InterruptedException;
sleep时间到达后线程进入就绪状态;
sleep可以模拟网络延时、倒计时等。
每一个对象都有一个锁,sleep不会释放锁。

//模拟网络延时:放大问题的发生性
public class TestSleep implements Runnable {private int ticketNums=10;//票数@Overridepublic void run() {while (true){synchronized (this) {if (ticketNums <= 0) break;System.out.println(Thread.currentThread().getName() + "———拿到了第" + ticketNums-- + "张票");}try {Thread.sleep(100);//模拟延时} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {TestSleep ticket=new TestSleep();new Thread(ticket,"小明").start();new Thread(ticket,"笑笑").start();new Thread(ticket,"淘气").start();}
}
//模拟倒计时
public class TestSleep2 {//模拟倒计时public static void tenDown() throws InterruptedException{int num=10;while(true){Thread.sleep(1000);System.out.println(num--);if (num<=0)break;}}public static void main(String[] args) throws InterruptedException {tenDown();
}
public class TestSleep2 { //打印当前时间public static void main(String[] args) throws InterruptedException {Date startTime=new Date(System.currentTimeMillis());//获取系统当前时间while(true){System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));Thread.sleep(1000);//更新系统当前时间startTime=new Date(System.currentTimeMillis());}}
}

线程礼让

**void yield() ** 礼让不一定成功,得看CPU调度情况

public class TestYield{public static void main(String[] args) {MyYield myYield=new MyYield();new Thread(myYield,"a").start();new Thread(myYield,"b").start();}
}
class MyYield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程开始执行");Thread.yield();System.out.println(Thread.currentThread().getName()+"线程停止执行");}
}
* 礼让成功: 		 * 礼让不成功:
* a线程开始执行		* a线程开始执行
* b线程开始执行  	    * a线程停止执行
* a线程停止执行	    * b线程开始执行
* b线程停止执行	  	* b线程停止执行

线程强制执行

void join() 等待该线程终止

//测试join方法 (想象为插队)
public class TestJoin implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) System.out.println("线程vip来了"+i);}public static void main(String[] args) throws InterruptedException {//启动我们的线程TestJoin testJoin=new TestJoin();Thread thread=new Thread(testJoin);thread.start();//主线程for (int i = 0; i < 100; i++) {if (i==50)thread.join();//插队System.out.println("main"+i);}}
}

观测线程状态

boolean isAlive() 测试线程是否处于活动状态

public class TestState {public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(()->{for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("///");});//观测状态Thread.State state=thread.getState();System.out.println(state);//NEW//观察启动后thread.start();//启动线程state=thread.getState();System.out.println(state);//RUN//只要线程不终止,就一直输出状态while(state!=Thread.State.TERMINATED){Thread.sleep(1000);state=thread.getState();//更新线程状态System.out.println(state);}//thread.start();//线程死亡后不能再次启动}
}

线程优先级

Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行

线程的优先级用数字表示,范围从1~10。主线程和子线程的默认优先级都是5
优先级高只是先执行的概率高,并不一定先执行;
优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用

优先级的设定建议在start()调度前

getPriority() 获得当前优先级
setPriority(int pri) 设置线程优先级

Thread.MAX_PRIOROTY=10
Thread.MIN_PRIOROTY=1
Thread.NORM_PRIOROTY=5

public class TestPriority {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+"----》"+Thread.currentThread().getPriority());MyPriority myPriority=new MyPriority();Thread t1=new Thread(myPriority);Thread t2=new Thread(myPriority);Thread t3=new Thread(myPriority);Thread t4=new Thread(myPriority);Thread t5=new Thread(myPriority);//先设置优先级再启动t1.start();t2.setPriority(1);t2.start();t3.setPriority(3);t3.start();t4.setPriority(10);t4.start();t5.setPriority(8);t5.start();}
}
class MyPriority implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"----》"+Thread.currentThread().getPriority());}
}

守护线程

线程分为用户线程和守护线程,虚拟机必须确保用户线程执行完毕,不用等待守护线程执行完毕,如:后台记录操作日志,监控内存,垃圾回收等。

void setDaemon(boolean on)
守护线程:后台线程,当所有的前台线程全部结束,即使后台线程没执行完,也立刻结束
需在线程启动前设置

//测试守护线程
//上帝守护你
public class TestDaemon {public static void main(String[] args) {God god=new God();You you=new You();Thread thread=new Thread(god);thread.setDaemon(true);//默认是false,表示是用户线程,普通的线程都是用户线程thread.start();//上帝守护线程开启new Thread(you).start();//你 用户线程启动}
}
//上帝
class God implements Runnable{@Overridepublic void run() {while(true){System.out.println("上帝保佑众生");}}
}
//你
class You implements Runnable{@Overridepublic void run() {for (int i = 0; i < 36500; i++) {System.out.println("开心地活着,第"+i+"天");}System.out.println("Goodbye,world!");}
}

用户线程执行完后,守护线程还运行了一会儿是因为,虚拟机关闭需要一定的时间

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

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

相关文章

RDMA (2)

iWARP(RDMA)怎么工作的 招式1:bypass内核 非iWARP时,当应用向网络适配器发出读或者写命令时,命令穿过用户空间以及内核空间,因此需要在用户空间和内核空间间进行切换。 iWARP使用RDMA,让应用直接将命令送达到网络适配器。这规避了对内核的调用,减少了开销和延迟。 招式2…

【Kubernetes】三证集齐 Kubernetes实现资源超卖(附镜像包)

目录 插叙前言一、思考和原理二、实现步骤0. 资料包1. TLS证书签发2. 使用 certmanager 生成签发证书3. 获取secret的内容 并替换CA_BUNDLE4.部署svc deploy 三、测试验证1. 观察pod情况2. 给node 打上不需要超售的标签【可以让master节点资源不超卖】3. 资源实现超卖4. 删除还…

[补题记录]Leetcode 209.长度最小的子数组

传送门&#xff1a;长度最小的子数组 Problem/题意 给定一个整数数组和一个整数 target&#xff0c;要求算出数组中最小长度的连续子数组&#xff0c;数组元素的和大于等于 target。 Thought/思路 题目要求维护最小的长度&#xff0c;因此我们希望&#xff1a;当条件不满足…

IP域名关系的研究与系统设计(学习某知名测绘系统)

IP域名关系库管理包括域名库检索和whois库检索&#xff0c;详情如下。 域名库检索支持以下5项功能&#xff1a; 1.通过过滤器检索 筛选条件包含IP地址、口令、工具名称、可利用的漏洞编号、创建时间&#xff1b; 2.通过关键字检索 在查询框中输入域名库名称的部分关键词&a…

计算机组成结构—IO系统概述

目录 一、I/O 系统的发展 1. 早期阶段 2. 接口模块和 DMA 阶段 3. 通道结构阶段 4. 处理机阶段 二、I/O 系统的组成 1. I/O 软件 2. I/O 硬件 三、I/O 设备 1. I/O 设备分类 2. I/O 设备的组成 在计算机中&#xff0c;除 CPU 和主存两大模块之外&#xff0c;第三个重…

Apple开发者应用商店(AppStore)描述文件及ADHOC描述文件生成

创建AD HOC描述文件 1.选中Profiles,然后点击加号创建 2.创建已注册设备可安装描述文件 3.选择要注册的id 4.选择证书 5.选择设备 6.输入文件名,点击生成 7.生成成功,点击下载

TCP为什么握手是三次,而挥手是四次

TCP&#xff08;传输控制协议&#xff09;使用三次握手&#xff08;3WHS&#xff09;来建立一个可靠的连接&#xff0c;并使用四次挥手&#xff08;4WHS&#xff09;来终止连接。以下是每个步骤的详细解释&#xff1a; 三次握手&#xff08;3WHS&#xff09;建立连接&#xff…

solidity的modifier修饰符

solidity的modifier修饰符 什么是modifier修饰符 修饰器&#xff08;modifier&#xff09;是solidity特有的语法&#xff0c;类似于面向对象编程中的decorator&#xff0c;声明函数拥有的特性&#xff0c;并减少代码冗余。 Solidity 中关键字 modifier 用于声明一个函数修改…

electron调用dll时应用程序闪退

electron调用dll时&#xff0c;直接闪退&#xff0c;且用如下方式监听无任何输出&#xff1a; window-all-closed 或 will-quit 此时需要检查传给dll的参数及参数类型是否正确&#xff0c;特别是使用ffi-napi时调用dll&#xff0c;使用 ref-napi定义类型&#xff0c;经常容易…

go 源码学习1:scanner学习

scanner所在包是scanner.go type scanner struct {// 步骤是一个函数&#xff0c;用于执行下一个转换。// 也尝试使用整数常量和单个函数以及带有开关的函数&#xff0c;// 但是直接使用函数在64位Mac Mini上快了10%&#xff0c;// 而且阅读起来更直观。step func(*scanner, …

域名区分英文大小写吗?

在互联网的早期&#xff0c;域名系统(DNS)的设计并没有考虑大小写敏感性。然而&#xff0c;随着技术的发展和用户需求的多样化&#xff0c;域名的大小写问题逐渐引起了人们的关注。本文将探讨域名是否区分英文大小写&#xff0c;以及这一特性对网站运营和用户体验的影响。 一、…

【Android】Git Patch生成的文件怎么合并到项目里面和遇到的一些问题

前言 Git patch是一种描述文件&#xff0c;它记录了一系列的文件变更&#xff08;如新增、修改、删除&#xff09;以及变更的具体内容。通过使用patch文件&#xff0c;可以将这些变更应用到其他代码库中&#xff0c;从而实现代码的同步和更新。 Git 提供了两种补丁方案&#…

Java使用OpenCV计算两张图片相似度

业务&#xff1a;找出两个表的重复的图片。 图片在表里存的是二进制值&#xff0c;存在大量由于一些特殊情况例如扫描有差异&#xff0c;导致图片存的二进制值不同&#xff0c;但图片其实是一样来的。 所以找出两个表重复相同的图片&#xff0c;不可能只是单纯的比较二进制值…

flask招聘数据分析及展示平台-计算机毕业设计源码39292

目 录 摘要 1 绪论 1.1研究意义 1.2国内外研究进展 1.3flask框架介绍 2 1.4论文结构与章节安排 3 2 招聘数据分析及展示平台分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分…

亚马逊新品如何快速吸引流量?自养号测评助卖家一臂之力

在亚马逊平台上每天都会有大量的新品推出&#xff0c;而这些新品中有部分可能并没有什么流量和订单&#xff0c;有些可能上架后立马就能获得流量了&#xff0c;那么亚马逊上新品一般几天出单&#xff1f; 一、亚马逊上新品一般几天出单&#xff1f; 亚马逊上新品出单的时间因…

DispatcherTimer应用

DispatcherTimer 是 WPF 中用于执行定时任务的类&#xff0c;用于在指定的时间间隔内执行任务。它与 UI 线程的 Dispatcher 相关联&#xff0c;因此可以用来更新 UI 元素&#xff0c;而不必担心线程安全问题。 关键特性&#xff1a; 线程安全&#xff1a;DispatcherTimer 确保…

人工智能时代,想转型AI产品经理?这篇文章你不应该错过

前言 在这个日新月异的智能时代&#xff0c;人工智能&#xff08;AI&#xff09;已经从未来概念转变为推动各行各业发展的核心驱动力。作为连接技术与市场的桥梁&#xff0c;AI产品经理的角色愈发关键&#xff0c;他们不仅是技术的翻译者&#xff0c;更是创新的推动者。如果你…

Mintegral解析休闲游戏如何靠创意素材吸引玩家

核心玩法简单清晰、容易让人无限上头的休闲游戏&#xff0c;玩法机制一般比较明确、简单&#xff0c;如果要在短时间内吸引玩家注意&#xff0c;除了完整展示游戏流程以外&#xff0c;开发者需要在素材中设置更多亮点性的内容&#xff0c;如吸睛的剧情、爆炸性的视听效果等元素…

组件的注册和引用

在Vue中&#xff0c;开发者可以将页面中独立的、可重用的部分封装成组件&#xff0c;对组件的结构&#xff0c;样式和行为进行设置。组件是 Vue 的基本结构单元&#xff0c;组件之间可以相互引用。 一.注册组件 当在Vue项目中定义了一个新的组件后&#xff0c;要想在其他组件中…

Vue3_对接腾讯云COS_大文件分片上传和下载

目录 一、腾讯云后台配置 二、安装SDK 1.script 引入方式 2.webpack 引入方式 三、文件上传 1.new COS 实例 2.上传文件 四、文件下载 腾讯云官方文档&#xff1a; 腾讯云官方文档https://cloud.tencent.com/document/product/436/11459 一、腾讯云后台配置 1.登录 对…