双非本科准备秋招(15.2)—— java线程常见方法

常见方法表格

方法名功能说明注意
start()启动一个新线 程,在新的线程 运行 run 方法 中的代码start 方法只是让线程进入就绪,里面代码不一定立刻 运行(CPU 的时间片还没分给它)。每个线程对象的 start方法只能调用一次,如果调用了多次会出现 IllegalThreadStateException
run()新线程启动后会 调用的方法如果在构造 Thread 对象时传递了 Runnable 参数,则 线程启动后会调用 Runnable 中的 run 方法,否则默 认不执行任何操作。但可以创建 Thread 的子类对象, 来覆盖默认行为
getName()获取线程名
setName(String)修改线程名
getPriority()获取线程优先级
setPriority(int)修改线程优先级java中规定线程优先级是1~10 的整数,较大的优先级 能提高该线程被 CPU 调度的机率
getState()获取线程状态Java 中线程状态是用 6 个 enum 表示,分别为: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
isInterrupted()判断是否被打 断,不会清除 打断标记
isAlive()线程是否存活 (还没有运行完 毕)
interrupt()打断线程如果被打断线程正在 sleep,wait,join 会导致被打断 的线程抛出 InterruptedException,并清除打断标记 ;如果打断的正在运行的线程,则会设置打断标记 ;park 的线程被打断,也会设置打断标记
interrupted()判断当前线程是 否被打断会清除 打断标记
currentThread()获取当前正在执 行的线程
sleep(long n)让当前执行的线 程休眠n毫秒, 休眠时让出 cpu 的时间片给其它 线程
yield()提示线程调度器 让出当前线程对 CPU的使用

 start()与run()

run还是让主线程操作,start可以让线程就绪。我们可以查看调用start前后线程的状态

        Thread t = new Thread("线程状态");log.debug("{}", t.getState());t.start();log.debug("{}", t.getState());

如果两次调用start,会报异常 IllegalThreadStateException。

sleep与yield

可以打印一下状态。sleep会让线程从Running->Timed Waiting

        Thread t1 = new Thread(()->{try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}},"线程状态");t1.start();log.debug("t1 state:{}", t1.getState());Thread.sleep(500);log.debug("t1 state:{}", t1.getState());

其他线程可以执行interrupt方法,打断sleep的线程

        Thread t1 = new Thread(()->{try {Thread.sleep(2000);} catch (InterruptedException e) {log.debug("I'm interrupted");}},"线程状态");t1.start();log.debug("t1 state:{}", t1.getState());Thread.sleep(500);t1.interrupt();

yield,让线程从Running到Runnable状态。也就是说,调用了yield会让线程进入Runnable状态,但有可能还会继续给这个线程分配时间片,导致没有将cpu资源让出去,但是sleep会真正让出cpu资源,cpu调度时不会考虑sleep的线程。

setPriority优先级

线程优先级会提示调度器优先调度该进程,但是调度器可以忽略它,cpu忙的时候,优先级高的获得的时间片多,但是cpu闲的时候,优先级几乎没用。

看看源码,分为最小、默认、最大优先级。

sleep应用

在没有利用cpu计算时,不要让while空转浪费cpu,这时候就需要sleep让出cpu使用权。

        while(true){Thread.sleep(50);}

sleep适用于无需锁同步的场景。

join应用——线程同步与限时同步

join可以等待线程结束,确保正确获取结果。

当我们不使用join,可能无法正确获取a的结果。

public class State {static int a = 10;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{a = 20;},"线程状态");t1.start();log.debug("{}", a);}
}

使用之后:

@Slf4j(topic = "c.test")
public class State {static int a = 10;public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{a = 20;},"线程状态");t1.start();t1.join();log.debug("{}", a);}
}

interrupt打断

1、可以打断阻塞的线程,sleep、wait、join,打断后会抛出异常,有打断标记。

2、打断正常线程,并不会真的打断,只是添加打断标记,正常线程可以通过检查自己的打断标记来查看是否被打断。

打断park线程

使用LockSupport.park()会让线程进入WAITING状态。

@Slf4j(topic = "c.test")
public class State {static int a = 10;public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {log.debug("park······");LockSupport.park();log.debug("unpark``````");log.debug("打断状态 {}", Thread.currentThread().isInterrupted());
//            log.debug("打断状态 {}", Thread.currentThread().interrupted());LockSupport.park();log.debug("再一次unpark");});t.start();Thread.sleep(1000);t.interrupt();}
}

park遇到isInterrupted()是true失效,可以用interrupted方法,可以看到这时线程就被park了。

  @Slf4j(topic = "c.park")public class Park {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {log.debug("park······");LockSupport.park();log.debug("unpark``````");//            log.debug("打断状态 {}", Thread.currentThread().isInterrupted());log.debug("打断状态 {}", Thread.currentThread().interrupted());​LockSupport.park();log.debug("再一次unpark");});t.start();​Thread.sleep(1000);t.interrupt();}}

不推荐的方法

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

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

相关文章

C++ 动态规划 线性DP 最长上升子序列

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 N 。 第二行包含 N 个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 1≤N≤1000 , −109≤数列中的数…

基于YOLOv8的船舶目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富; …

使用Python的turtle模块实现简单的烟花效果

import turtle import random import math# 设置窗口大小 width, height 800, 600 screen turtle.Screen() screen.title("Fireworks Explosion") screen.bgcolor("black") screen.setup(width, height)# 定义烟花粒子类 class Particle(turtle.Turtle):…

01 JDK的安装

JDK的安装 1 JDK的安装:参考: 1 JDK的安装: 说到Java,永远都有一个绕不开的话题,就是JDK(Java Development Kit)。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。安装JD…

2024/2/3

一.选择题 1、适宜采用inline定义函数情况是(C) A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&#xff0c…

数字化转型:企业适应新常态的关键之举_光点科技

在全球商业环境不断演变和技术日新月异的背景下,数字化转型已经成为企业不可回避的课题。它不仅关乎企业的未来生存与发展,更是适应新常态、提升竞争力的关键之举。但是,数字化转型并非一夜之间可以完成的任务,它需要全面的策略规…

IDEA常用debug调试技巧

我们先来了解Debug栏中位于左侧的主要的5个功能键。 1. 第一个,有返回箭头的按钮,功能是重新执行Debug,当你在执行Debug一半时,发行并不能解决你的问题,这时你不需要重新关闭并打开Debug,按下此按钮&#x…

【开源】SpringBoot框架开发大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

投资更好的管理会计系统,探索全面预算管理的奥秘

目前,我国财政体制正值如火如荼的调整阶段,各级政府和部门响应国家号召,旨在加强管理会计系统建设,制定具有先导性和科学性的现代化全面预算管理制度,从而将我国财力推向一个新高度。其中,基于服务或产品的…

07. 【Linux教程】远程登录

Linux 远程登录 前面介绍了如何安装 Linux 终端工具,本小节介绍本地电脑如何使用 ssh 命令远程登录、Linux 终端工具远程登录的方式,这两种登录方式都是基于 ssh 网络安全协议的,学会使用远程登录 Linux 服务器,会让你对 Linux 系…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException(并发修改异常)是基于java集合中的 快速失败(fail-fast) 机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,…

配置nginx作为静态文件托管服务器

下载nginx windows上是个压缩包 解压后, 使用命令行输入 nginx 进行启动 nginx -s stop 进行停止 nginx -s status 查看状态 可以配置一下环境变量 主要是配置文件, windows的nginx配置文件在 conf文件夹下 在http标签下 添加如下配置 其他地方不用更改,保持原样即可, 以…