zoukankan      html  css  js  c++  java
  • Java线程的中断与插入

    interrupt() 方法

    ​ 其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

    实例: 先输出10次线程名,然后等待20秒,在主方法调用interrupt()方法。

    class ThreadTest extends Thread {
        @Override
        public void run() {
            while (true) {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName() + " " + i);
                }
                try {
                    Thread.sleep(20000);
                    System.out.println(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    System.out.println(Thread.currentThread().getName() + " 中断");
                }
            }
        }
    }
    

    主方法

    public static void main(String[] args) {
        ThreadTest t = new ThreadTest();
        t.start();
        t.setName("子线程");
    
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        t.interrupt(); // 当执行到这里就会中断T线程的休眠
        System.out.println("线程优先级:"+t.getPriority());
    }
    

    运行结果

    image

    ​ 从结果中可以看出,在调用interrupt()方法时,直接跳过睡眠,进行下一次循环。


    join()与yield()

    join():线程的插队。插队的线程一旦插队成功,则肯定先执行玩插入的线程所有的任务,即让“主线程”等待“子线程”结束之后才能继续运行 。

    yield():线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功。

    实例:创建一个子线程,每隔0.5秒输出hello,输出10此,主线程每个1秒输出hi,输出10次。要求两个线程通知执行,当主线程输出5此后,就让子线程运行完毕,主线程在继续。

    class ThreadTest extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(500); // 休眠0.5秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("hello------" + i + " threadName:" + Thread.currentThread().getName());
            }
        }
    }
    

    主方法

    public static void main(String[] args) throws InterruptedException {
        ThreadTest t = new ThreadTest();
        t.start();
        t.setName("子线程");
        for (int i = 0; i < 10; i++) {
            Thread.sleep(500);
            System.out.println("hi " + i + " threadName:" + Thread.currentThread().getName());
            if (i == 5){
                System.out.println("~~~~~~t.join()~~~~~~");
                // join 线程插队
                t.join();
                // 不一定成功
                // Thread.yield();
            }
        }
    }
    

    运行结果

    image

    ​ 从运行结果可以看出,在前5次,主线程和子线程之间是交替运行的,当条用t.join()方法之后,主线程等待子线程,子线程完全运行完毕之后开始主线程。


    线程常用的方法一
    方法名 说明
    setName 设置线程名,使之与参数name相同
    getName 返回线程的名称
    start 使用线程开始执行;java虚拟机底层调用线程的start0方法
    run 调用线程对象的run方法
    setPriority 更改线程的优先级
    getPriority 获取线程的优先级
    sleep 在指定的毫秒数内瓤正在执行的线程睡眠(暂停执行)
    interrupt 中断线程
    线程常用的方法二
    方法名 说明
    yield 线程的礼让。让出cpu,让其他线程执行,但礼让的时间不切丁,所以也不一定礼让成功
    join 线程的插队。插队的线程一旦插队成功,则肯定先执行玩插入的线程所有的任务。
  • 相关阅读:
    判断广播是否已注册
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    Android BroadcastReceiver 注册和反注册
    关于Android TaskAffinity的那些事儿
    文件读取方法(FileHelpers) z
    FileHelpers 用法 z
    tdf sample
    打开文件
    async/await 异步编程
    使用Topshelf创建Windows服务
  • 原文地址:https://www.cnblogs.com/ilyar1015/p/14702842.html
Copyright © 2011-2022 走看看