Java多线程之过时的suspend 与 resume

Thread类提供的以下两个方法:

public final void suspend()

public final void resume()

就像如标题所说的一样,它们都被Java废弃了。原因如下:

public class MyThread {
    private static final Object lock = new Object();

    private static class Producer extends Thread{
        Producer() {
            super.setName("producer");
        }
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("in producer");
                Thread.currentThread().suspend();
                System.out.println("producer is resume");
            }
        }
    }

    private static class Consumer extends Thread {
        Consumer() {
            super.setName("consumer");
        }
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("in consumer");
                Thread.currentThread().suspend();
                System.out.println("consumer is resume");
            }
        }
    }

    static Producer producer = new Producer();
    static Consumer consumer = new Consumer();

    public static void main(String args[]) throws InterruptedException {
        producer.start();
        //此处是为了让producer先执行,防止producer的resume先于suspend执行。
        Thread.sleep(2000);
        consumer.start();
        producer.resume();
        consumer.resume();
        producer.join();
        consumer.join();
        System.out.println("All shop");
    }
}

结果如下:

in producer
producer is resume
in consumer

此时程序不会退出来,因为consumer线程被suspend了。
使用idea的Dump Threads 可以看到线程状态:

"consumer" #13 prio=5 os_prio=0 tid=0x000000002115f800 nid=0x18440 runnable [0x0000000021edf000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.Thread.suspend0(Native Method)
    at java.lang.Thread.suspend(Thread.java:1032)
    at StackAndColumn.MyStack1$Consumer.run(MyStack1.java:28)
    - locked <0x000000076b598638> (a java.lang.Object)

被suspend挂起的线程状态显示为"RUNNABLE"状态,这给排查bug带来困难性。

从main方法便可以看出,sleep(2000);
是为了防止producer的resume比suspend先执行,所以producer线程能够正确执行。

而consumer退不出是因为main方法在执行consumer.resume();时该线程还未获得锁资源无法进入同步代码块、尚未执行suspend方法。换言之就是resume方法意外地比suspend方法先执行导致的错误。

请大家一起抛弃它们。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,695评论 19 139
  • 一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线...
    我是嘻哈大哥阅读 1,032评论 0 8
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 2,212评论 0 8
  • 首先附上链接:https://github.com/wangtaoHappy/SwiftPassword在此 de...
    努力才幸运阅读 2,078评论 0 3
  • 文/宏木每 本属于花园 用来芬芳前庭 现在变成一张冰冷的通行证 用来证明爱情
    宏木每阅读 93评论 0 0

友情链接更多精彩内容