你真的了解Java的多线程方法吗
作者:WYSCODER 发布时间:2022-02-01 22:55:40
Java 多线程方法详解
start
start
方法 启动线程 在start方法中调用start0
方法,而start0
是一个本地方法,其底层是C++实现的。
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
private native void start0();
run
run
方法 子线程的执行体,在其方法体中编写线程逻辑,run
方法和普通成员方法一样,可以重复调用,当我们单独调用run
方法时会在当前线程中执行run
方法,并不会启动新线程。
yield
yield方法线程让步暂停当前线程的执行,并让步于其他同优先级的线程,让其他线程先执行
yield方法是Thread类中的静态方法
public static native void yield();
特点
yield
方法的让步,能让正在执行的线程由“运行状态”进入到“就绪状态”,等待调度执行。yield
仅仅是让出CPU资源,让给谁,是有系统决定的,系统会让其他相同优先级或者是更高优先级的线程来获取执行权,要是没有更高优先级的线程,会继续执行原来的线程。
join
join
方法 线程合并 暂停当前线程的执行,等待子线程执行完毕再继续执行当前线程,也叫做线程插队,join
方法做的事情就是讲并行或并发执行的线程合并为串行执行。
代码示例:
public class ThreadMethod02 {
public static void main(String[] args) throws InterruptedException {
T2 t2 = new T2();
t2.start();
//主线程打印
int count = 0;
for (int i = 1; i <= 10; i++) {
Thread.sleep(1000);
System.out.println("main" + i);
if (++count == 5) {
t2.join();//子线程插队
}
}
}
}
class T2 extends Thread {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep(1000);//休眠一秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A" + i);
}
}
}
运行结果:
sleep
sleep
线程休眠,在sleep期间,线程运行状态从运行进入到阻塞状态,会让出CPU的执行权,当线程被重新唤醒时,会由阻塞状态进入到就绪状态,等待CPU的使用权
方法介绍:
sleep
方法主要有两个,sleep(long millis)
和sleep(long millis, int nanos)
两个方 * 能类似,后一个方法提供更高精度的纳秒级控制。sleep
方法是Thread里提供的静态方法,当前的方法也是可以抛出InterruptedException
异常,可以被Interrupt中断掉。
Interrupt
代码示例:
Interrupt
中断线程 interrupt
方法调用仅仅修改了一个中断标志。 如果当前线程是可中断的状态(调用了sleep、join、wait等方法导致线程进入阻塞状态)在其他线程中调用interrupt方法,会立即抛出一个InterruptedException
异常,来停止掉中断。如果当前处于运行状态,调用interrupt方法,线程会继续执行,直到发生sleep、join、wait等方法的调用,才会进入阻塞。
Interrupt
方法在Thread类中,是一个普通方法,可以通过对象来调用。
public class ThreadMethod03 {
public static void main(String[] args) throws InterruptedException {
T3 t3 = new T3();
t3.start();
for (int i = 0; i < 3; i++) {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
}
t3.interrupt();//发送中断
}
}
class T3 extends Thread {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("A");
}
try {
System.out.println("进行休眠");
Thread.sleep(20000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + "被Interrupted!!!");
}
}
}
运行结果:
deamon
deamon
方法 守护线程 Java线程有两种,一种是守护线程,一种是用户线程,用户线程一般用户执行用户级任务,一般创建的线程都是用户线程,守护线程也叫做“后台线程”服务于用户线程,一般就是用来执行后台任务,例如:垃圾回收就是由专门线程来处理的,负责垃圾回收的线程就是守护线程。
守护线程存在两个方法
public final void setDaemon(boolean on)
设置守护线程,参数是true和false,true表明设置为守护线程, false,设置为非守护线程 ,默认是false。
public final boolean isDaemon()
判断是否守护线程,返回Boolean类型
代码示例:
public class ThreadMethod04 {
public static void main(String[] args) throws InterruptedException {
T4 t4 = new T4();
t4.setDaemon(true);//将子线程设置为守护线程
t4.start();
if (t4.isDaemon()) {//判断是否是守护线程
System.out.println("子线程是守护线程");
}else {
System.out.println("子线程不是守护线程");
}
for (int i = 1;i <= 5;i++) {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class T4 extends Thread {
@Override
public void run() {
while (true) {//无限循环
try {
Thread.sleep(1000);// 休眠1s钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
}
运行结果:
主线程结束,子线程同时结束
Priority
Priority
线程优先级,就是用来指导线程执行的优先权
方法介绍
public final void setPriority(int newPriority)
:设置线程的优先级public final int getPriority()
:获取线程的优先级
优先级范围
设置Java线程的优先级,最小值为1,默认值是5,最大值是10
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
方法特点
1. 线程的优先级并不绝对,所控制的是执行的机会,优先级高的线程执行的概率是比较大,而优先级低的线程也并不是没有机会,只是执行的概率会低一些。
2. 优先级共10个优先级,分别为1-10,数值越大,表明优先级越高,普通的线程优先级是5。
3. 线程的优先级是用来指导JVM层面优先哪个线程执行,最终执行顺序还是需要操作系统来指定。
4. 注意:代码最好不要依赖于优先级线程,有可能会造成问题,Java中给定的优先级并不一定严格按照给定优先级执行。
代码示例:
public class ThreadMethod05 {
public static void main(String[] args) {
T5 t5 = new T5();
t5.setPriority(10);//设置优先级为10
int priority = t5.getPriority();//获取优先级
System.out.println(priority);
}
}
class T5 extends Thread {
@Override
public void run() {
System.out.println("A");
}
}
运行结果:
来源:https://blog.csdn.net/sheng0113/article/details/123797045
猜你喜欢
- Java中的try-catch-finally异常处理一、异常处理异常(Exception):是在运行发生的不正常情况。原始异常处理:if(
- 描述项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因
- JDK * 实现原理 * 机制通过实现 InvocationHandler 接口创建自己的调用处理器通过为 Proxy 类指定 Clas
- 本文实例讲述了Java实现的读取资源文件工具类ResourcesUtil。分享给大家供大家参考,具体如下:package com.gclou
- 1 redis主从复制的概念多机环境下,一个redis服务接收写命令,当自身数据与状态发生变化,将其复制到一个或多个redis。这种模式称为
- 一.优先队列的应用优先队列在程序开发中屡见不鲜,比如操作系统在进行进程调度时一种可行的算法是使用优先队列,当一个新的进程被fork()出来后
- 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,
- 本文帮助大家掌握Java多线程基础知识来对应日后碰到的问题,具体内容如下一、Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是
- 1、首先导入solrj需要的的架包2、需要注意的是低版本是solr是使用SolrServer进行URL实例的,5.0之后已经使用SolrCl
- 使用通配符增强泛型1.题目泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。实现:在泛型方法中使用通配符2.解题思路创建一个类:
- 前言Zuul 是Netflix 提供的一个开源组件,致力于在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。也有很多公司使用它来作为
- 前言我们在学习Windows应用程序开发中,经常会用到消息对话框给用户或者管理员一些的消息提示,它们都是基于对MessageBox类的消息对
- 最近需要对接支付宝的支付接口,官方文档写得内容有点分散,整理了一下发布出来,用作记录,同时也希望对不了解情况的人有所帮助,这里以电脑端的网页
- 本文实例为大家分享了java实现通过绑定邮箱找回密码功能,供大家参考,具体内容如下1.输入用户名及验证码,验证用户名是否存在(1).生成验证
- 在Java的学习中,涉及到两个系统环境变量path和classpath一. path环境变量path环境变量是系统环境变量的一种,它用于保存
- 栈和队列:都是线性表,都是基于List基础上的实现线性表:数组,链表,字符串,栈,队列元素按照一条“直线&rdq
- 1、使用场景 因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法
- 项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是boo
- 前言在RocketMQ中为,我们创建消息生产者时,只需要设置NameServer地址,消息就能正确地发送到对应的Broker中,那么Rock
- 1、设置ssh安装ssh相关软件包:sudo apt-get install openssh-client openssh-server然后