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

news2024/11/28 12:47:46

文章目录

  • 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);
		}
		
	}
}

运行结果:

在这里插入图片描述

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

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

相关文章

电脑提示d3dcompiler43.dll缺失怎么解决?四种方法帮你轻松搞定!

d3dcompiler_43.dll是一个与DirectX相关的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它主要用于Windows操作系统上的图形和游戏应用程序。这个文件的主要作用是编译和解析DirectX应用程序中的图形代码。 DirectX是一个强大的图形API&#xff08;应用程序编程接口&…

flutter项目中使用阿里图标库自定义图标步骤,5分钟搞定

因为flutter自带的图标可能并不能满足业务需求&#xff0c;所以需要加入图标非常丰富的阿里图标库的支持&#xff0c;阿里图标库的地址&#xff1a;iconfont-阿里巴巴矢量图标库&#xff0c;先看一下使用阿里图标库后的效果图&#xff1a;网页端和手机端都是可以正常运行的&…

Centos7安装frps作内网穿透--实现外部访问家里群晖

实现在外可访问家用群晖 需要在外界访问家里的局域网设备&#xff0c;正常情况是需要有公网IP&#xff0c;而IPV4作为家用&#xff0c;运营商基本不给&#xff0c;除非钞能力&#xff0c;IPV6可以用&#xff0c;但是有缺陷&#xff0c;需要互访的两端都是IPV6才能访问。选择fr…

关于400G光模块的常见问题解答

最近在后台收到了很多用户咨询关于400G光模块的信息&#xff0c;那400G光模块作为当下主流的光模块类型&#xff0c;有哪些问题是备受关注的呢&#xff1f;下面来看看小易的详细解答&#xff01; 1、什么是400G QSFP-DD光模块&#xff1f; 答&#xff1a;400G光模块是指传输速…

Ubuntu16.04上安装Docker

Ubuntu16.04上安装Docker 更新 apt 包索引: sudo apt-get update安装依赖包,以便使用 HTTPS 仓库 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu…

rabbitMQ的direct模式的生产者与消费者使用案例

消费者C1的RoutingKey 规则按照info warn 两种RoutingKey匹配 绑定队列console package com.esint.rabbitmq.work03;import com.esint.rabbitmq.RabbitMQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DeliverCallback;/*** 消费者01的消息接受*/ p…

windows server 华夏ERP部署手册

软件包准备&#xff1a; .安装MySql 找到mysql程序双击进行安装,进入这个页面 选择Server only点击Next 进入到下图,点击execute&#xff0c;等待完成&#xff0c;点击下一步 点击install安装插件 安装完插件点击下一步 等待程序加载完成,点击下一步 继续下一步 进行下一步 进行…

智慧校园电子班牌 智能互联家校互通源码 springboot

利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现生态基础数据共享、应用生态统一管理&#xff0c;为智慧教育建设的统一性&#xff0c;稳定性&#xff0c;可扩展性&#xff0c;互通性提供保障的智慧教育一体化云解决方案。 在大数…

VIM去掉utf-8 bom头

Windows系统的txt文件在使用utf-8编码保存时会默认在文件开头插入三个不可见的字符&#xff08;0xEF 0xBB 0xBF&#xff09;称为BOM头 BOM头文件 0.加上BOM标记&#xff1a; :set bomb 1.查询当前UTF-8编码的文件是否有BOM标记&#xff1a; :set bomb? :set bomb? 2.BOM头:文…

麒麟信安助力长沙市就业与社保数据服务中心政务系统向自主创新演进

应用场景 长沙市就业与社保数据服务中心依托长沙市“政务云”的公共基础资源和相应的支撑能力&#xff0c;围绕社保、就业、人事人才、劳动关系等人社全量业务服务&#xff0c;力求建立以“智慧服务、智慧监管、智慧决策”为核心的“智慧人社”综合服务平台&#xff0c;实现人…

Java面向对象2

代码块 代码块的构造顺序优先于构造器 细节

shopee知虾数据:提升Shopee店铺运营效果必备工具—知虾数据工具

在如今竞争激烈的电商市场中&#xff0c;如何提升Shopee店铺的运营效果成为了每个卖家都关注的问题。而Shopee知虾数据工具作为一款专为Shopee虾皮平台设计的数据分析工具&#xff0c;为卖家提供了多项强大的功能&#xff0c;能够帮助卖家在开店、选款、测款、爆款以及初始和成…

flutter仿支付宝余额宝年化收益折线图

绘制: 1.在pubspec.yaml中引入:fl_chart: 0.55.2 2.绘制: import package:jade/utils/JadeColors.dart; import package:util/easy_loading_util.dart; import package:fl_chart/fl_chart.dart; import package:flutter/material.dart; import package:flutter_screenutil/…

【文件上传】01ctfer 文件上传获取flag

1.1漏洞描述 漏洞名称01ctfer 文件上传漏洞类型文件上传漏洞等级⭐⭐⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.环境搭建 1.创建docker-compose.yml文件 version: 3.2 services: upload: …

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日&#xff0c;拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观&#xff0c;集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流&#xff0c;旨在共同探讨携手合作&#xff0c;激发科…

kubernetes部署jenkins

参考&#xff1a;kubernetes 部署 Jenkins jenkins kubernetes pipeline_mob64ca14116c53的技术博客_51CTO博客 第七篇&#xff1a;kubernetes部署jenkins-CSDN博客 1、当前kubernetes集群已部署nfs服务 showmount -e 创建jenkins目录 2、添加jenkins的pvc kubectl create …

spring cloud之配置中心

Config 统一配置中心(*) 1.简介 # 统一配置中心 - 官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.3.RELEASE/reference/html/#_spring_cloud_config_server- config 分为 config server 和 config client。用来统一管理所有微服务的配置统一配置…

超过5000+企业使用的ETL平台

在当今数据驱动的时代&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;工具扮演着关键角色&#xff0c;而ETLCloud作为一款脱颖而出的数据集成平台&#xff0c;正以其独特的特性和强大的功能&#xff0c;成为当前国内最活跃的数据集成平台&#xff0c;目前用户…

2023.11.17 -hivesql调优,数据压缩,数据存储

目录 1.hive命令和参数配置 2.hive数据压缩 3.hive数据存储 0.原文件大小 18.1MB 1.textfile行存储格式, 压缩后size:18MB 2.行存储格式:squencefile ,压缩后大小8.89MB​ 3. 列存储格式 orc - ZILIB ,压缩后大小2.78MB 4.列存储格式 orc-snappy ,压缩后大小3.75MB 5…

springboot327基于Java的医院急诊系统

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————