【多线程】常用的方法

前言:

  1. 上篇博文简单讲解了多线程的三种实现方式: https://blog.youkuaiyun.com/zhangyong01245/article/details/100593167
  2. 本篇博文简单介绍一下 Thread 中常用的方法。

先来看一下线程的状态[图片来自网上]:

在这里插入图片描述

方法:

以下的方法在Thread 的源码中均可以查询到,有兴趣的小伙伴可以自行查阅。

  1. start() :使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

  2. run():如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

  3. setName(String name):改变线程名称,使之与参数 name 相同

  4. setPriority(int piority) 更改线程的优先级【实际使用效果不明显,有点鸡肋】

  5. setDaemon(boolean on) 将该线程标记为守护线程或用户线程【true-守护线程,false-用户线程】

  6. join(long millisec) 等待该线程终止的时间最长为 millis 毫秒【有无参方法】

  7. interrupt() 线程设置中断标志。

  8. isAlive() 测试线程是否处于活动状态

  9. yield() 作用是让步,把自己CPU执行的时间让掉,并和其他线程一起重新竞争CPU【注意有可能是自己再次被执行】

  10. sleep(long millisec) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响

  11. currentThread() 返回对当前正在执行的线程对象的引用

部分方法解释:
  1. setDaemon()和isDaemon() 用来设置线程是否成为守护线程和判断线程是否是守护线程,需要在线程启动之前进行调用。
    守护线程和用户线程的区别在于:守护线程依赖于创建它的线程,而用户线程则不依赖。举个简单的例子:如果在main线程中创建了一个守护线程,当main方法运行完毕之后,守护线程也会随着消亡。而用户线程则不会,用户线程会一直运行直到其运行完毕。在JVM中,像垃圾收集器线程就是守护线程,

  2. join(long millisec) 等待该线程终止的时间最长为 millis 毫秒或者到线程执行结束【无参或者参数为0会一直等待线程执行结束】,源码:

   /**
     *  参数值为0,表示一直等待,知道线程执行结束
     *  不为0, 等待到线程结束 或者 超时返回
     * @param millis 毫秒
     * @throws InterruptedException
     */
    public final synchronized void join(long millis)
            throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            //  线程是否处于活动状态
            while (isAlive()) {
                // java原生方法,参数0表示,一直等待线程到结束
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                // java原生方法,参数不为0表示,一直等待线程到结束,或者到指定delay时间结束
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }
  1. interrupt() 线程设置中断标志,一般用于在外部设置该线程的中断点,结合 interrupted() isInterrupted() 方法结束run 方法。
    需要注意的是 :
    interrupt() :线程设置中断标志,并不会结束线程。
    isInterrupted(): 返回调用此方法的线程是否有中断标志,不会去除中断点【注意作用范围,调用的线程】
    interrupted():是 Thread中的 static 方法,调用方式 Thread.interrupted(),根据其代码 currentThread().isInterrupted(true); 可知,其返回的是当前线程的中断状态。 和isInterrupted()的区别一个是调用者的线程状态,一个是当前线程的状态, interrupted() 调用后会返回线程是否有中断标志,并且会移除线程的中断状态。

注意: 当线程方法wiat、join、sleep三种方法之一,在起作用时,调用它的 interrupte()方法,会生成一个InterruptedException异常,没有占用CPU 运行的线程是不可能给自己一个中断状态置位的。

更详细讲解: https://blog.youkuaiyun.com/zhangyong01245/article/details/100711341

  1. sleep、wait、notify()、notifyAll()
    sleep 的作用是使当前线程睡眠指定的时间,放弃对CPU的占用,但是不会放弃对线程以获取到的锁
    wait() : 会将当前线程进入休眠状态,并且释放当前获取到的对象锁,并将当前线程放入到等待池中,等待notify、notifyAll 将其唤醒并进入锁池中竞争对象锁,
    notify 从等待池中随机选择【和优先级也有关】唤醒其中一个线程,进入到锁池中等待对象锁,并执行,其他等待池中线程继续等待。
    notifyAll 将等待池中所有的线程全部唤醒到锁池中,然后去竞争对象锁,
    更详细讲解: https://blog.youkuaiyun.com/zhangyong01245/article/details/100746128

END.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值