当前位置:首页 > Java技术 > Java 多线程方法详解

Java 多线程方法详解

2022年11月07日 14:39:46Java技术6

⭐写在前面⭐

🧭Java 多线程
🎉 内容回顾
Java 多线程介绍及线程创建
Java 多线程七大状态
📢今天我们进行 Java 多线程方法详解 的学习,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步💯!!!
♨️如果觉得博主文章还不错,可以👍三连支持⭐一下哦😀

Java 多线程方法详解

start

start方法 启动线程 在start方法中调用start0方法,而start0是一个本地方法,其底层是C++实现的,其调用原理在博客Java 多线程介绍及线程创建中有详细的阐述。

    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方法,并不会启动新线程。

Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

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

运行结果:
Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

sleep

sleep线程休眠,在sleep期间,线程运行状态从运行进入到阻塞状态,会让出CPU的执行权,当线程被重新唤醒时,会由阻塞状态进入到就绪状态,等待CPU的使用权

方法介绍:

  • sleep方法主要有两个,sleep(long millis)sleep(long millis, int nanos)两个方法功能类似,后一个方法提供更高精度的纳秒级控制。
  • sleep方法是Thread里提供的静态方法,当前的方法也是可以抛出InterruptedException异常,可以被Interrupt中断掉。

Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

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!!!");
        }
    }
}

运行结果:
Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

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

运行结果:

主线程结束,子线程同时结束
Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

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

运行结果:
Java 多线程方法详解 _ JavaClub全栈架构师技术笔记

作者:WYSCODER
来源链接:https://blog.csdn.net/sheng0113/article/details/123797045

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68317.html

分享给朋友:

“Java 多线程方法详解” 的相关文章

java数数字及while和do while 的使用,以及程序的调试与验证

while的条件是在进入循环体之前判断的,执行完一轮循环之后,会再回到循环开始的地方再次判断条件,而不会在循环体中随时判断条件 1.while语句是当条件满足时不断的执行循环体内语句。 2.会提前判断是否满足条件,所以有可能一次也没有执行。 3.条件成立...

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看 下面语句: Object ob = new Ob...

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 上一篇总结了下ArrayList 、LinkedList和Vector比较,今天泥瓦匠总结下Hash 、LinkedList和Vector比较。其实大家都是...

java提高篇(十六)

java提高篇(十六)

     Java的基本理念是“结构不佳的代码不能运行”!!!!!       大成若缺,其用不弊。       大...

java空指针异常:java.lang.NullPointException

一.什么是java空指针异常     我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析。空指针就是空引用,java空指针异常就是引用本身为空,却调用了方...

java高级

java高级

  Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。下...

Java 基础之详解 Java IO

Java 基础之详解 Java IO

Java IO 基本概念 Java IO:即 Java 输入 / 输出系统。 区分 Java 的输入和输出:把自己当成程序, 当你从外边读数据到自己这里就用输入(InputStream/Reader), 向外边写数据就用输出(OutputStream/Writer)。...

java synchronized详解

记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同...

Java 基础【06】 Super 用法

     路漫漫其修远兮,吾将上下而求索。——屈原《离骚》      昨天写this用法总结的时候,突然产生了一个问题,请教别人之后,有了自己的一点认识。还是把它写下来,为大家更好的认识提供一点思路。 1)有人写了...

java中的内存模型

java中的内存模型

概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型。究竟什么...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。