• Thread方法解释(join,sleep,yield,interrupt)


    join方法
    几种重写的join方法

    void join()
    等待该线程终止。
    void join(long millis)
    等待该线程终止的时间最长为 millis 毫秒。
    void join(long millis, int nanos)
    等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

    抛出:
    IllegalArgumentException - 如果 millis 值为负,则 nanos 的值不在 0-999999 范围内。
    InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。
    如果在主线程main中创建一个子线程,并调用子线程的join()方法,则主线程会等待子线程执行完毕,或子线程执行时间完成后,再继续执行。
    例子:

    package processthread; 
    /** 
     * @author wangpei 
     * @version 
     *创建时间:2017年3月11日 上午9:57:13 
     * 类说明 
     */
    public class Test {
    
    class Thread1 extends Thread{
        public void run(){
            System.out.println("进入线程"+Thread.currentThread().getName());
    
        }
    
    }
    public static void main(String[] args) {
        System.out.println("进入线程"+Thread.currentThread().getName());
        Test ts=new Test();
        Test.Thread1 t1=ts.new Thread1();
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程"+Thread.currentThread().getName()+"继续执行");
    
    
    
    }
    }
    

    main线程会等待,thread-0线程执行完毕后再执行。
    结果:

    进入线程main
    进入线程Thread-0
    线程main继续执行
    

    没加t1.join(); 时结果:

    进入线程main
    线程main继续执行
    进入线程Thread-0

    看一下join方法源码:
    这里写图片描述

    可以看出,其延迟时间调用了wait(delay).因为线程调用wait()方法后,其对于正在操作的对象锁会自动释放,线程处于阻塞状态,所以,调用join方法后,线程阻塞,线程失去对该对象锁的持有,失去cpu.

    对象锁:每个对象都有一个监听器,线程使用该对象时,必须先获得其监听器(锁),才能执行,而其他未获得该锁的对象处于阻塞状态.

    sleep方法

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

    static void sleep(long millis, int nanos)
    在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
    nanos - 要休眠的另外 0-999999 纳秒。

    可能抛出
    IllegalArgumentException - 如果 millis 值为负或 nanos 值不在 0-999999 范围内。
    InterruptedException - 如果任何线程中断了当前线程。当抛出该异常时,当前线程的中断状态 被清除。

    sleep方法执行后,处于阻塞状态,线程会交出cpu,对该对象的锁没有交出,其他线程也无法访问该对象。
    线程执行sleep方法,主线程不会像join方法那样等待子线程执行完再执行,mian线程会和子线程同时执行。

    sleep方法源码,直接调用sleep()

      public static void sleep(long millis, int nanos)
        throws InterruptedException {
            if (millis < 0) {
                throw new IllegalArgumentException("timeout value is negative");
            }
    
            if (nanos < 0 || nanos > 999999) {
                throw new IllegalArgumentException(
                                    "nanosecond timeout value out of range");
            }
    
            if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
                millis++;
            }
    
            sleep(millis);
        }
    

    yield方法
    public static void yield()暂停当前正在执行的线程对象,并执行其他线程。

    调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。

      注意,调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

    interrupt方法
    单独调用interrupt方法可以使得处于阻塞状态的线程抛出一个异常,也就说,它可以用来中断一个正处于阻塞状态的线程;另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。

  • 相关阅读:
    Three.js源码阅读笔记4
    算法导论11.动态规划上
    leetcode刷题笔录1
    JavaScript的模块化:封装(闭包),继承(原型)
    leetcode刷题笔录5
    算法导论1.排序算法
    算法导论3.递归部分习题选
    Three.js Demo源码分析1.MorphTargets与BufferGeometry
    算法导论10.顺序统计树与区间树习题
    算法导论4.随机快速排序与线性时间排序
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551233.html
Copyright © 2020-2023  润新知