我的编程空间,编程开发者的网络收藏夹
学习永远不晚

你真的了解Java的多线程方法吗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

你真的了解Java的多线程方法吗

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

运行结果:

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

你真的了解Java的多线程方法吗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Java】你掌握了多线程吗?

【文末送书】今天推荐一本Java多线程编程领域新书《一本书讲透Java线程》 摘要 互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转型的过程中
【Java】你掌握了多线程吗?
2023-12-22

线程与进程,你真得理解了吗

线程与进程,你真得理解了吗 1 进程与线程的关系和区别2 并行与并发3 线程共享了进程哪些资源 相信大家面试时一定没少被一个问题刁难,那就是进程和线程的区别是什么?这个问题延申开来并不像表面那么简单,今天就来深入一探。 开始前先
2023-08-17

关于Java Object你真的了解了吗

导读: 在平时的coding中hashCode()和equals()的使用的场景有哪些?clone深复制怎么实现?wait()和notify()有什么作用?finalize()方法干嘛的?看似coding中使用的不多,不重要,但是有没有跟我
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录