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 线程的插队。插队的线程一旦插队成功,则肯定先执行玩插入的线程所有的任务。
posted @ 2021-04-26 01:03  ilyar1015  阅读(79)  评论(0编辑  收藏  举报