【java学习—十五】Thread类的有关方法(3)

文章目录

  • 1. 基本方法
  • 2. 线程的优先级
  • 3. 进阶方法
    • 3.1. 举例
      • 3.1.1. 线程让步
      • 3.1.2. join() 方法
      • 3.1.3. sleep()方法
      • 3.1.4. stop() 方法
      • 3.1.4. isAlive() 方法


1. 基本方法

方法名作用
void start()启动线程,并执行对象的 run() 方法
run()线程在被调度时执行的操作
String getName()返回线程的名称
void setName(String name)设置该线程名称
static currentThread()返回当前线程

举例:

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);
		
		t0.start();
		t1.start();
		
		t0.setName("线程t0");//设置线程的名称
		
		System.out.println(t0.getName());//如果在创建线程的时候没有指定名称,系统会给出默认名称,通过getNmae()获取线程名称
		System.out.println(t1.getName());
		
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		System.out.println("-----------------------3");
		
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:

在这里插入图片描述

2. 线程的优先级

线程的优先级控制:
    优先级从1-10的整数共10个等级概率
    1 代表最低优先级;10 代表最高优先级;5 代表普通优先级。

涉及的方法:
    getPriority():返回线程优先值
    setPriority(int newPriority):改变线程的优先级

    线程创建时继承父线程的优先级

举例:

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");
		
		t0.setPriority(1);//设置线程优先级
		t1.setPriority(10);
		
		t0.start();
		t1.start();
		
//		System.out.println(t0.getName());//如果在创建线程的时候没有指定名称,系统会给出默认名称,通过getNmae()获取线程名称
//		System.out.println(t1.getName());
		
		/**
		 * 线程的优先级,就是那个线程有较大的概率被执行
		 * 优先级是用数字1-10表示,数字越大优先级越高,如果没有设置优先级则默认是5
		 */
		
		System.out.println("t-0的优先级:" + t0.getPriority());//获取线程的优先级
		System.out.println("t-1的优先级:" + t1.getPriority());//获取线程的优先级
		
			
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		System.out.println("-----------------------3");		
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果(其中一种结果):

在这里插入图片描述

这里需要注意:
    虽然设置了t1的优先级高于t0,但是优先级只是概率问题,概率高的不一定就先执行(只是先执行的可能更大)

3. 进阶方法

static void yield():线程让步
    暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
    若队列中没有同优先级的线程,忽略此方法

join():当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止
    低优先级的线程也可以获得执行

static void sleep(long millis): ( 指定时间 : 毫秒 )
    令当前活动线程在指定时间段内放弃对 CPU 控制 , 使其他线程有机会被执行 , 时间到后重排队。
    抛出 InterruptedException 异常

stop():强制线程生命期结束

boolean isAlive():返回 boolean ,判断线程是否还活着

3.1. 举例

3.1.1. 线程让步

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");//设置线程的名称
		
		t0.start();
		t1.start();	
				
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		System.out.println("-----------------------3");
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			if(i % 2 ==0) {
				Thread.yield();//线程让步
			}
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:

在这里插入图片描述

注意:
    线程让步可能在结果展现上并不明显,但实际上确实让步了。

3.1.2. join() 方法

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");//设置线程的名称		
		
		t0.start();
		t1.start();		
				
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		
		//join()方法
		try {
			t0.join();//相当于在这块把t0的run的代码插入到这个位置执行
			/**
			 * 专业的说法:
			 * 就是阻塞当前的main方法,先不执行System.out.println("-----------------------3")代码
			 * 先执行join进来的线程的代码
			 * join的线程执行完毕之后继续执行之前main方法阻塞的代码System.out.println("-----------------------3")
			 */
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		System.out.println("-----------------------3");
		
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:

在这里插入图片描述

上面代码无论执行多少次,线程t-0的运行结果始终在“--------------2”和“----------------3”之间。

3.1.3. sleep()方法

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");//设置线程的名称
				
		t0.start();
		t1.start();					
		
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");		
		System.out.println("-----------------------3");
		
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			
			try {
				Thread.sleep(1000);//当前线程睡眠1000毫秒
				//相当于当前的这个循环每隔1000毫秒执行一次循环
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:
    每隔1s逐步输出

3.1.4. stop() 方法

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");//设置线程的名称
		
		t0.start();
		t1.start();	
		
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		System.out.println("-----------------------3");
		
		t1.stop();//强制线程生命期结束,强制停止此线程
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:

在这里插入图片描述

可以看出t-1线程刚执行就结束了

3.1.4. isAlive() 方法

package day15;

public class Test1 {
	public static void main(String[] args) {
		TestRun run0 = new TestRun();
		TestRun run1 = new TestRun();
		
		Thread t0 = new Thread(run0);
		Thread t1 = new Thread(run1);

		t0.setName("线程t-0");//设置线程的名称
		t1.setName("线程t-1");//设置线程的名称
		
		t0.start();
		t1.start();						
		
		System.out.println("-----------------------1");
		System.out.println("-----------------------2");
		System.out.println("-----------------------3");
		
		System.out.println(t1.isAlive());//判断当前线程是否存活
		
		t1.stop();//强制线程生命期结束,强制停止此线程
		
		System.out.println(t1.isAlive());//判断当前线程是否存活
	}
}

class TestRun implements Runnable{
	
	int count = 0;
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName() + ":Runable多线程运行的代码");
		for(int i = 0; i <5; i++) {
			count++;
			System.out.println(Thread.currentThread().getName() + ":这是Runable多线程的逻辑代码:" + count);
		}
		
	}
}

运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

T13级专家被毕业?!研发大牛被裁带来的警示丨IDCF

2005年加入腾讯&#xff0c;腾讯第一位Web前端专家&#xff0c;T13职级&#xff0c;今年1月仍是腾讯前端最高专家。 在47岁的时候&#xff0c;拥有这样简历的前端大牛黄希彤被腾讯裁员。 黄希彤夫人在小红书上透露&#xff1a;&#xff08;黄希彤&#xff09;在鹅厂工作了15年…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

ROS 学习应用篇(六)参数的使用与编程

node可能不在一个电脑里但是这些服务的参数信息是共享的&#xff0c;因为话题Topic是异步的所以只有服务Service有实时参数信息可以调用。 接下来将演示服务参数信息的调用与修改。 创建功能包(工作空间src文件夹下) catkin_create_pkg learning_parameter roscpp rospy std…

MySQL中全文索引和普通索引的区别

MySQL中的全文索引&#xff08;Full-Text Index&#xff09;和普通索引&#xff08;比如B-Tree索引&#xff09;是为了提高查询效率而设计的&#xff0c;但它们适用于不同的场景和查询类型。 普通索引&#xff08;如B-Tree索引&#xff09; 适用场景&#xff1a;普通索引适用于…

jsp中使用PDF.js实现pdf文件的预览

本文介绍的是在使用jsp作为模板引擎的spring-mvc项目中&#xff0c;如何利用 PDF.js实现pdf文件的预览。 1、下载 PDF.js Getting Started (mozilla.github.io) 下载解压后其中有两个目录&#xff0c;直接将这两个文件夹放到项目的web资源目录中。此时相当于把PDF.js这个项目也…

3ds max 2024 V-Ray 6 ACES workflow 工作流设置

ACES的流程包括2个设置&#xff1a; 1、环境设置&#xff1b;2、贴图设置&#xff1a; 一、环境设置&#xff1a;3ds max 2024已经内置了OCIO文件&#xff1b;设置一下即可&#xff1b; 二、贴图设置&#xff1a; 所有类型贴图加载有默认和加后缀2种方法&#xff1a; 第一…

使用VC++设计程序使用邻域平均平滑算法、中值滤波算法、K近邻均值滤波器(KNNF)进行滤波

VC实现若干种图像滤波技术 文章目录 VC实现若干种图像滤波技术实验内容邻域平均平滑算法1. 原理2. 实验代码3. 实验现象 中值滤波算法1. 原理2. 实验代码3.实验现象 K近邻均值滤波算法&#xff08;KNNF&#xff09;1. 原理2. 实验代码实验现象 实验内容 实验要求&#xff1a; …

【机器学习】 特征工程:特征预处理,归一化、标准化、处理缺失值

特征预处理采用的是特定的统计方法&#xff08;数学方法&#xff09;将数据转化为算法要求的数字 1. 数值型数据 归一化&#xff0c;将原始数据变换到[0,1]之间 标准化&#xff0c;数据转化到均值为0&#xff0c;方差为1的范围内 缺失值&#xff0c;缺失值处理成均值、中…

PDF处理控件Aspose.PDF功能演示:使用C#查找和替换PDF文件中的文本

使用“查找并替换”选项可以一次性替换文档中的特定文本。这样&#xff0c;您不必手动定位和更新整个文档中每次出现的文本。本文甚至更进一步&#xff0c;介绍了如何在PDF文档中自动查找和替换文本功能。特别是&#xff0c;将学习如何使用C&#xff03;在整个PDF&#xff0c;特…

外汇天眼:失败的投资者经常陷入两个误区!

一、价格与价值的混淆 在金融领域&#xff0c;价格和价值往往被错误视为同义词。然而&#xff0c;审视市场时&#xff0c;我们会逐渐发现一个“安全差”的重要概念&#xff0c;这是由巴菲特的导师本杰明格雷厄姆提出的。 安全差是指股票的内在价值与市场价格之间的差异。内在…

WMS仓储管理系统与TMS系统整合后的优势

随着全球化的加速和供应链网络的日益复杂&#xff0c;仓库和运输成为企业运营中的两个关键环节。为了更高效地管理这两个环节&#xff0c;许多企业开始探索将WMS仓储管理系统和TMS运输管理系统整合的可能性。这种整合不仅可以提升仓库流程的可见性&#xff0c;还有助于改善调度…

1、24 个常见的 Docker 疑难杂症处理技巧(一)

1Docker 迁移存储目录 默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下 [问题起因] 今天通过监控系统&#xff0c;发现公司其中一台服务器的磁盘快慢&#xff0c;随即上去看了下&#xff0c;发现 /var/lib/docker 这个目录特别大。由上述原因&#xff0c;我们都知…

配置 ssh 免密登录

背景 从机器 A 使用 ssh 免密登录到机器 B&#xff0c;两台机器的 OS 都是 CentOS。其中机器 B 用作了一台 nodejs 的服务器&#xff0c;已经安装并运行了 sshd 服务&#xff0c;其用户名是 jmmem 我们想要实现在机器 A 上键入 ssh nodejs 就能免密登录到机器 B 的效果 机器…

python 最快多长时间学完?

以下是一个为零基础学员制作Python速成学习计划。这个计划包括了一些基本的Python概念和技能&#xff0c;以及一些实用的学习技巧。 第1周&#xff1a;基础入门 Python简介&#xff1a;了解Python的历史、特点、应用领域。 安装Python&#xff1a;在你的电脑上安装Python&am…

一个 不用充钱 也能让你变强的 VSCode 插件

今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;可以称之为 copilot 的替代甜品 &#x1f4aa; 什么是 通义灵码&#xff08;TONGYI Lingma&#xff09; 通义灵码&#xff08;TONGYI Lingma&#xff09;&am…

Martins 用法-利用现有的数学公式来绘制三相电机电流相位之间的关系

你可能会对这个主题很感兴趣。这背后的原因是我想分享一种我在花了大量时间研究诊断三相电机的方式时发现到的技术。我发现有一种非常简单的方式可以做到这一点&#xff0c;与Pico团队分享后&#xff0c;Steve Smith将它命名为Martins用法。 那么&#xff0c;让我们开始吧。 Ma…

Pinia 及其数据持久化 Vue新一代状态管理插件

黑马前端Vue新一代状态管理插件Pinia快速入门视频教程 Pinia主页 超级简单&#xff0c;不需要耐心 pinia &#xff1a;新一代的VueX 1. 安装 npm install pinia2. 在main.js中引入 import { createPinia } from pinia app.use(createPinia())3. 新建stores目录&#xff0c…

Camtasia2024喀秋莎微课制作神器新版本功能介绍

最近无论是b站&#xff0c;抖音&#xff0c;快手等视频软件中都有不少微课视频、电视剧解说横空出世&#xff0c;通过这些“热度”带来的收益也是无法估量的&#xff0c;很多自媒体博主月入上万惹人羡慕。 不少朋友也想在这股短视频洪流中分一碗羹&#xff0c;但又苦于技术跟不…

areadetector ADURL模块应用在面探测控制的初步应用

本章中讨论了使用ADURL控制面探测器Lambda的过程&#xff1a; ADURL的使用请见&#xff1a; EPICS -- areaDetector URL驱动程序-CSDN博客 需要启动一个ADURL的IOC程序&#xff0c;并且设置相关的插件中参数的值&#xff1a; # st.cm < envPaths < st_base.cmddbpf 1…

mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性

什么是约束&#xff1a;约束&#xff1a;就是约定哪些东西能填、怎么填&#xff1f;哪些东西不能填&#xff1f; 文章目录 前言&#xff1a;建表正文一、实体完整性约束1. 主键约束2. 唯一性约束3. 自增长约束4. 联合主键约束 二、域完整性约束三、引用完整性约束1. 外键约束 讲…