多线程常用方法的学习

方法

sleep

sleep()方法会让当前线程从RUNNING进入Timed Watting阻塞状态。

interrupt() 方法,由其他线程调用,将被调用的线程从Thread.sleep()方法中唤醒过来,将会抛出InterruptedException异常

public static void main(String[] args) {
    Thread t1 = new Thread(() -> {
        log.debug("running");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            log.debug("wake up");
            e.printStackTrace();
        }
    }, "t1");
    t1.start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    t1.interrupt();
}

案例

防止while(true){}在单核CPU上资源占用100%的问题。可以使用sleep方法线程进入睡眠让CPU出来解决资源占用问题。

使用场景:在无需锁同步的场景下使用

Thread.sleep(1);

yield

yield()方法即让出该线程的使用权,将线程从运行状态转换为就绪状态,让操作系统重新分配CPU使用权

优先级即给任务调度器只是一个提示的作用,并不能实质上控制任务调度器分配CPU资源

thread.setPriority(Thread.MAX_PRIORITY); // 设置线程优先级
thread.setPriority(Thread.MIN_PRIORITY);

join

join()方法即当前线程等待调用该join方法的线程执行结束才能继续运行

同步等待线程结束(同步即等待线程结束才继续执行当前线程)

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    },"t1");
    Thread t2 = new Thread(() -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    },"t2");
    t1.start();
    t2.start();
    log.debug("start");

    t1.join();
    log.debug("t1 join");
    t2.join();
    log.debug("t2 join");
    
}

同步限时等待(即在当前限时间内即参数1500毫秒没有得到响应就继续执行下一步,提前得到响应会立刻继续执行)

t1.join(1500);

interrupt

interrupt()当调用线程的interrupt()打断方法时,会将其打断阻塞状态置为true。

Thread.currentThread().isInterrupted()  // 获取当前的打断状态Boolean值
Thread.interrupted()  // 获取当前打断状态并恢复为true

案例

可以使用该方法优雅的让线程结束

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            while (true){
                boolean interrupted = Thread.currentThread().isInterrupted();
                if (interrupted){
                    log.debug("程序被告知要结束了");
                    break;
                }
            }
        },"t1");
        t1.start();
        log.debug("通知打断");
        Thread.sleep(1000);
        t1.interrupt();
    }

不推荐使用方法

stop() 方法,直接停止线程运行,直接导致后果就是锁资源不能被释放,会导致死锁。

suspend() 方法 挂起(暂停)线程

resume() 恢复线程运行

守护线程

守护线程跟随主线程的生命周期,主线程结束,守护线程也会跟着结束

垃圾回收器就是守护线程,跟随主线程。

线程状态

操作系统的五种状态:准备、就绪、运行、阻塞、结束

Java层面的六种状态:

public enum State {
    NEW,  // 创建没有运行

    RUNNABLE,  // 运行

    BLOCKED,  // 请求获得锁

    WAITING,   // join

    TIMED_WAITING,   // sleep

    TERMINATED; // 运行结束
}
posted @   大队长11  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示