Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java多线程实战:多线程方法详解

Java多线程实战:多线程方法详解

作者头像
田维常
发布于 2019-11-28 06:58:55
发布于 2019-11-28 06:58:55
83600
代码可运行
举报
运行总次数:0
代码可运行

多线程的常用方法

1、currentThread()方法:

介绍:currentThread()方法可返回该代码正在被哪个线程调用的信息。

示例

例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test01 {
 
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
    
}

输出:main

结果说明,main方法被名为main的线程调用

例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    public Mythread() {
        System.out.println("构造方法的打印:"+Thread.currentThread().getName());
    }
    
    @Override
    public void run() {
        System.out.println("run方法的打印:"+Thread.currentThread().getName());
    }
}
 
public class Test01 {
 
    public static void main(String[] args) {
        Mythread t=new Mythread();
        t.start();//①
    }
    
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
构造方法的打印:main
run方法的打印:Thread-0

从结果可知:Mythread的构造方法是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是线程自动调用的

现在我们将①处的代码改为t.run(),现在的输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
构造方法的打印:main
run方法的打印:main

从结果中我们可以看到两次的结果显示都是main线程调用了方法,因为当你使用t.start()方法的时候是线程自动调用的run()方法,所以输出的是Thread-0,当你直接调用run()方法时,和调用普通方法没有什么区别,所以是main线程调用run();

2、isAlive()方法:

介绍:isAlive()方法的功能是判断当前的线程是否处于活动状态

示例:

例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        System.out.println("run =="+this.isAlive());
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) {
        Mythread thread=new Mythread();
        System.out.println("begin =="+thread.isAlive());//①
        thread.start();//②
        System.out.println("end =="+thread.isAlive());//③
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
结果:
begin ==false
end ==true
run ==true

方法isAlive()的作用是测试线程是否处于活动状态。那么什么情况下是活动状态呢?活动状态就是线程已经启动且尚未停止。线程处于正在运行或准备开始运行的状态,就认为线程是存活的

①处代码的结果为false,因为此时线程还未启动;

②处代码调用了run()方法输出结果为run ==true,此时线程处于活动状态;

③处代码的结果为true,有的同学看到这个输出可能会不理解,不是说线程处于活动状态isAlive()方法的结果才是true,现在程序都已经运行结束了为什么还是true?这里的输出结果是不确定的,我们再来看下面一段代码

我们将例1中的代码稍做修改,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        System.out.println("begin =="+thread.isAlive());//①
        thread.start();//②
        Thread.sleep(1000);//这里加了一行代码,让当前线程沉睡1秒
        System.out.println("end =="+thread.isAlive());//③
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin ==false
run ==true
end ==false

现在我们看到③处的代码结果为end ==false,因为thread对象已经在1秒内执行完毕,而上面代码输出结果为true是因为thread线程未执行完毕。

3、sleep()方法:

介绍:

方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),这个“正在执行的线程”是指this.currentThread()返回的线程。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        
        try {
            System.out.println("run threadName="+this.currentThread().getName()+" begin");
            Thread.sleep(2000);
            System.out.println("run threadName="+this.currentThread().getName()+" end");
            
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        System.out.println("begin ="+System.currentTimeMillis());
        thread.run();//①
        System.out.println("end ="+System.currentTimeMillis());
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin =1574660731663
run threadName=main begin
run threadName=main end
end =1574660733665

从结果中可以看出main线程暂停了2秒(因为这里调用的是thread.run())

下面我们将①处的代码改成thread.start(),再来看下运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
begin =1574661491412
end =1574661491412
run threadName=Thread-0 begin
run threadName=Thread-0 end

由于main线程与thread线程是异步执行的,所以首先打印的信息为begin和end,而thread线程是随后运行的,在最后两行打印run begin和run end的信息。

4、getId()方法:

介绍:getId()方法的作用是取得线程的唯一标识

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Thread thread=Thread.currentThread();
        System.out.println(thread.getName()+" "+thread.getId());
    }
    
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main 1

从运行结果可以看出,当前执行代码的线程名称是main,线程id值为1

5、停止线程:

介绍:停止线程是在多线程开发时很重要的技术点,掌握此技术可以对线程的停止进行有效的处理。停止线程在Java语言中并不像break语句那样干脆,需要一些技巧性的处理。

在java中有三种方法可以停止线程

  1. 使用退出标志,让线程正常退出,也就是当run方法执行完之后终止
  2. 使用stop方法强制终止线程,但是不推荐使用,因为stop和suspend及resume一样,是java废弃的方法
  3. 使用interrupt方法中断线程(推荐使用)

示例:

例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        
        for(int i=0;i<5000;i++) {
            System.out.println("i="+(i+1));
        }
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        thread.start();
        Thread.sleep(2000);
        thread.interrupt();
    }
    
}

运行结果:

从运行结果我们可以看出最后i=500000,调用interrupt方法没有停止线程,那么该如何停止线程呢?

在介绍如何停止线程时,我们先来介绍一下如何判断线程是否处于停止状态

Thread类中提供了两种方法用来判断线程是否停止:

1、this.interrupted():测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static boolean interrupted() {
        return currentThread().isInterrupted(true);
}

2、this.isInterrupted():测试线程Thread对象是否已经中断,但是不清除状态标志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public boolean isInterrupted() {
        return isInterrupted(false);
}

读者可以仔细观看一下这两个方法的声明有什么不同?

例2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        
        for(int i=0;i<5000;i++) {
            System.out.println("i="+(i+1));
        }
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        System.out.println("是否停止1?="+thread.interrupted());
        System.out.println("是否停止2?="+thread.interrupted());
        System.out.println("end!");
    }
    
}

结果:

输出结果显示调用了thread.interrupt()方法后线程并未停止,这也就证明了interrupted()方法的解释:测试当前线程是否已经中断。这个当前线程是main,它从未断过,所以打印的结果是两个false。

如果想让main线程结束该怎么做?

将main方法改成如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Thread.currentThread().interrupt();
        System.out.println("是否停止1?="+Thread.interrupted());
        System.out.println("是否停止2?="+Thread.interrupted());
        System.out.println("end!");
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
是否停止1=true
是否停止2=false
end!

从输出结果我们可以看出,方法interrupted()的确判断出当前线程是否是停止状态。但为什么第2个值是false?

查看一下官方文档的介绍:

测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。

文档中说明的非常清楚,interrupted()方法具有清除状态的功能,所以第二次调用interrupted方法返回的值时false。

下面我们来看一下isInterrupted()方法,将main方法改成如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        thread.start();
        thread.interrupt();
        Thread.sleep(1000);
        System.out.println("是否停止1?="+thread.isInterrupted());
        System.out.println("是否停止2?="+thread.isInterrupted());
        System.out.println("end");
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
是否停止1=true
是否停止2=true
end

从结果可以看出,方法isInterrrupted()并未清除状态,所以结果为两个true。

例3:在沉睡中停止

当线程调用sleep()方法后再调用interrupt()方法后会有什么结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        
        try {
            System.out.println("run begin");
            Thread.sleep(200000);
            System.out.println("run end");
        } catch (InterruptedException e) {
            System.out.println("在沉睡中被停止,进入catch!"+this.isInterrupted());
            e.printStackTrace();
        }
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        try {
            Mythread thread=new Mythread();
            thread.start();
            Thread.sleep(200);
            thread.interrupt();
        }catch(Exception e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end!");
    }
    
}

6、暂停线程:

暂停线程意味着此线程还可以恢复运行。在java多线程中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程的执行

例1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    private long i=0;
    public long getI() {
        return i;
    }
    
    public void setI(long i) {
        this.i = i;
    }
    
    @Override
    public void run() {
        while(true) {
            i++;
        }
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        
        Mythread thread=new Mythread();
        thread.start();
        Thread.sleep(5000);
        //A段
        thread.suspend();
        System.out.println("A= "+System.currentTimeMillis()+" i="+thread.getI());
        Thread.sleep(5000);
        System.out.println("A= "+System.currentTimeMillis()+" i="+thread.getI());
        
        //B段
        thread.resume();
        Thread.sleep(5000);
        
        //C段
        thread.suspend();
        System.out.println("B= "+System.currentTimeMillis()+" i="+thread.getI());
        Thread.sleep(5000);
        System.out.println("B= "+System.currentTimeMillis()+" i="+thread.getI());
        
    }
    
}

结果:

从控制台打印的时间上来看,线程的确被暂停了,而且还可以恢复成运行状态。

7、yield方法:

介绍:yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    @Override
    public void run() {
        long beginTime=System.currentTimeMillis();
        int count=0;
        for(int i=0;i<500000;i++) {<br>               //Thread.yield();①
            count=count+(i+1);
        }
        long endTime=System.currentTimeMillis();
        System.out.println("用时:"+(endTime-beginTime)+"毫秒!");
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        Mythread thread=new Mythread();
        thread.start();
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
用时:2毫秒!

现在将①处的代码取消注释,我们再来看一下运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
用时:213毫秒!

将CPU让给其他资源导致速度变慢

8、线程优先级:

介绍:

在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务。

设置线程优先级有助于帮“线程规划器”确定在下一次选择哪一个线程来优先执行。

设置线程的优先级使用setPriority()方法,此方法在JDK的源代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
}

在Java中,线程的优先级为1-10这10个等级,如果小于1或大于10,则JDK抛出异常

throw new IllegalArgumentException()

通常高优先级的线程总是先执行完,但是并不是一定的,高优先级和低优先级的线程会交替进行,高优先级执行的次数多一些

线程优先级的继承特性:

在Java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread2 extends Thread{
    @Override
    public void run() {
        System.out.println("Mythread2 run priority="+this.getPriority());
    }
}
 
 
class Mythread1 extends Thread{
    
    @Override
    public void run() {
        System.out.println("Mythread run priority="+this.getPriority());
        Mythread2 thread2=new Mythread2();
        thread2.start();
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        
        System.out.println("main thread begin priority="+Thread.currentThread().getPriority());
                //Thread.currentThread().setPriority(6);①
        System.out.println("main thread end priority="+Thread.currentThread().getPriority());
        Mythread1 thread1=new Mythread1();
        thread1.start();
    }
    
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main thread begin priority=5
main thread end priority=5
Mythread run priority=5
Mythread2 run priority=5

可以看到上面几个线程的优先级都为5

现在将①处的代码注释掉后的结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main thread begin priority=5
main thread end priority=6
Mythread run priority=6
Mythread2 run priority=6

优先级被更改后再继续继承

9、守护线程:

在java中有两种线程,一种是用户线程,另一种是守护线程。

守护线程是一种特殊的线程,它的特性有“陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。用个比较通俗的比喻来解释一下:“守护线程”:任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是GC(垃圾回收器),它就是一个很称职的守护者。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Mythread extends Thread{
    
    private int i=0;
    
    
    @Override
    public void run() {
        
        try {
            while(true) {
                i++;
                System.out.println("i="+(i));
                Thread.sleep(1000);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        
    }
    
}
 
public class Test01 {
 
    public static void main(String[] args) throws InterruptedException {
        
        try {
            Mythread thread=new Mythread();
            thread.setDaemon(true);
            thread.start();
            Thread.sleep(5000);
            System.out.println("我离开Thread对象就不再打印了,也就是停止了");
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.cnblogs.com/wgblog-code/p/11928825.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java多线程技能
本文介绍了线程的用法,包括线程的创建、启动、挂起、结束等操作,并讲解了线程的共享资源、线程的同步、线程的中断等概念。同时,本文还介绍了线程的优先级、线程的状态、线程的同步、线程的通信、线程的调度、线程的同步等问题。
Java后端工程师
2017/12/13
1.1K0
Java多线程学习(一)Java多线程入门
Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide
用户2164320
2018/06/17
2.2K0
Java多线程学习(二)——Thread类的方法使用
停止线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前操作。有以下三种方法终止正在运行中的线程:
小森啦啦啦
2019/07/14
6560
【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧。 正文 线程与进程 1 线程:进程中负责程序执行的执行单元 线程本身依靠程序进行运行 线程是程序中的顺序控制流,只能使用分配给程序的资源和环境 2 进程:执行中的程序 一个进程至少包含一个线程 3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程 4 多线程:在一个程序中运行多个任务 目的是更好地使用CPU资源 线程的实现 继承Thread类
Angel_Kitty
2018/04/09
9000
【Java学习笔记之三十四】超详解Java多线程基础
万字长文,Thread 类源码解析!
金九银十,很多小伙伴都打算跳槽。而多线程是面试必问的,给大家分享下 Thread 源码解析,也算是我自己的笔记整理、思维复盘。学习的同时,顺便留下点什么~
JavaFish
2020/09/14
1.3K0
万字长文,Thread 类源码解析!
多线程编程学习一(Java多线程的基础).
一、进程和线程的概念 进程:一次程序的执行称为一个进程,每个 进程有独立的代码和数据空间,进程间切换的开销比较大,一个进程包含1—n个线程。进程是资源分享的最小单位。 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小,线程是CPU调度的最小单位。 多进程:指操作系统能同时运行多个任务(程序)。 多线程:指同一个程序中有多个顺序流在执行,线程是进程内部单一控制序列流。        线程和进程一样包括:创建、就绪、运行、阻塞、销毁 五个状态: 1、新建状态(New
JMCui
2018/03/16
8310
多线程编程学习一(Java多线程的基础).
多线程(一):创建线程和线程的常用方法
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
全栈程序员站长
2022/08/11
1.1K0
多线程(一):创建线程和线程的常用方法
Java线程基础操作
进程和线程的概念 进程 比较好理解,打开Windows 的任务管理器进程页里的一个个 exe 就可以理解为一个进程。 线程可以理解是在进程中独立运行的子任务 ,具体见百度百科 https://baike.baidu.com/item/%E7%BA%BF%E7%A8%8B 使用线程 创建一个线程主要有两种方式 继承 Thread 类 实现 Runnable 接口 Note: Thread 类其实是实现了 Runnable 接口的。使用继承 Thread 的方式创建线程时,最大的局限就是不支持多继承,
佛系编码
2018/07/04
4390
你真的了解 Thread 线程类吗?
在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用 CPU 资源,显著的提升程序的执行效率。
Java极客技术
2023/09/14
3690
你真的了解 Thread 线程类吗?
Java多线程的基本应用
在JDK1.5推出了TimeUnit类,该类可以根据时间单位来对线程进行睡眠操作;
绿水长流z
2024/06/13
1130
Java多线程的基本应用
Java多线程
1.新建:程序使用new创建线程后,就是新建状态,jvm会为他分配内存,并初始化成员变量的值
用户11010370
2024/03/08
1170
Java 多线程学习
这些动作都可以抽象为任务,虽然看起来一心二用,但人只有一个大脑,在一个时间片刻只能处理一个任务。
默 语
2024/11/20
970
Java 多线程学习
Java中的多线程基本介绍
在 Java 中,多线程是指同时执行两个或多个线程以最大限度地利用 CPU 的过程。 Java 中的线程是一个轻量级进程,只需要较少的资源即可创建和共享进程资源。
从大数据到人工智能
2022/02/08
7020
Java多线程编程核心技术
一个进程正在运行时至少会有一个线程在运行,这种情况在Java中也是存在的。这些线程在后台默默地执行,比如调用public static void main()方法的线程就是这样的,而且它是由JVM创建的。
Remember_Ray
2020/08/05
2K0
Java多线程编程核心技术
Thread实现及方法
如果在构造Thread的时候没有显示地指定一个ThreadGroup,那么子线程将会被加入到父线程所在的线程组里边。
HLee
2021/04/19
8150
Thread实现及方法
并发编程1:全面认识 Thread
本文介绍了Java编程中线程的创建方式、启动方式、线程池的创建和线程池的使用,以及线程池的拒绝策略。同时,本文还介绍了线程的 run() 和 start() 方法的区别以及线程的中断和终止等知识点。
张拭心 shixinzhang
2018/01/05
7730
并发编程1:全面认识 Thread
多线程快速入门与多线程与线程高级(多线程实战【三】)
初始化状态 就绪状态 运行状态 死亡状态 阻塞状态 超时等待 等待状态
高大北
2022/06/14
3530
多线程快速入门与多线程与线程高级(多线程实战【三】)
Java多线程第一篇-认识多线程
这里的主线程的入口方法如果结束,则主线程销毁,只要代码执行完,则主线程销毁,参考下⬇️
如烟花般绚烂却又稍纵即逝
2024/12/26
650
Java多线程第一篇-认识多线程
Java多线程二: Thread中几个比较重要的方法
sleep作为最常见的方法之一,其作用就是使调用sleep的所在线程进入睡眠状态。它会让调用该方法的所在线程主动放弃CPU资源,进入阻塞状态,如果指定了睡眠时间,到达了指定时间之后线程就会进入就绪状态,等待调度器的调用。sleep()方法是Thread类的静态方法,如果调用线程对象.sleep()方法并不是该线程就休眠,而是哪一个线程里面执行了sleep()方法哪一个线程就休眠。
全栈学习笔记
2022/04/24
2540
Java并发编程基础篇(一)之线程
Java并发编程基础篇(一)之线程
Java架构师必看
2021/04/13
5110
Java并发编程基础篇(一)之线程
相关推荐
Java多线程技能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验