过期的suspend()、resume()和stop()

Java线程API:suspend(),resume()和stop()的过时与替代
本文通过实例展示了Java中线程的suspend(),resume()和stop()方法的使用,强调了这些过时方法可能导致死锁和资源未释放的问题,提倡使用等待/通知机制作为替代方案。

大家对于CD机肯定不会陌生,如果把它播放音乐比作一个线程的运作,那么对音乐播放做出的暂停、恢复和停止操作对应在线程Thread的API就是suspend()、resume()和stop()。

在代码清单4-8所示的例子中,创建了一个线程PrintThread,它以1秒的频率进行打印,而主线程对其进行暂停、恢复和停止操作。

代码清单4-8 Deprecated.java


public class Deprecated {
    public static void main(String[] args) throws Exception {
        DateFormat format = new SimpleDateFormat("HH:mm:ss");
        Thread printThread = new Thread(new Runner(), "PrintThread");
        printThread.setDaemon(true);
        printThread.start();
        TimeUnit.SECONDS.sleep(3);
        // 将PrintThread进行暂停,输出内容工作停止
        printThread.suspend();
        System.out.println("main suspend PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
        // 将PrintThread进行恢复,输出内容继续
        printThread.resume();
        System.out.println("main resume PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
        // 将PrintThread进行终止,输出内容停止
        printThread.stop();
        System.out.println("main stop PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
    }
    static class Runner implements Runnable {
        @Override
        public void run() {
            DateFormat format = new SimpleDateFormat("HH:mm:ss");
            while (true) {
                System.out.println(Thread.currentThread().getName() + " Run at " + 
                    format.format(new Date()));
                SleepUtils.second(1);
            }
        }
    }
}

输出如下(输出内容中的时间与示例执行的具体时间相关)。


PrintThread Run at 17:34:36
PrintThread Run at 17:34:37
PrintThread Run at 17:34:38
main suspend PrintThread at 17:34:39
main resume PrintThread at 17:34:42
PrintThread Run at 17:34:42
PrintThread Run at 17:34:43
PrintThread Run at 17:34:44
main stop PrintThread at 17:34:45

在执行过程中,PrintThread运行了3秒,随后被暂停,3秒后恢复,最后经过3秒被终止。

通过示例的输出可以看到,suspend()、resume()和stop()方法完成了线程的暂停、恢复和终止工作,而且非常“人性化”。但是这些API是过期的,也就是不建议使用的。

不建议使用的原因主要有:以suspend()方法为例,在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。同样,stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。

注意 正因为suspend()、resume()和stop()方法带来的副作用,这些方法才被标注为不建议使用的过期方法,而暂停和恢复操作可以用后面提到的等待/通知机制来替代。

在IT领域中,“suspendresume”是两个常用的术语,通常与系统、进程、线程或设备的状态管理相关。 ### 含义 - **Suspend**:意为暂停、挂起。将系统、进程、线程或设备的当前状态保存,然后停止其运行活动,进入一种低功耗或等待状态,以节省资源。 - **Resume**:意为恢复、继续。将之前处于挂起状态的系统、进程、线程或设备恢复到挂起前的状态,继续执行后续的操作。 ### 用法及相关技术 #### 操作系统层面 在操作系统中,suspendresume操作常用于电源管理。以引用[1]中提到的“基于kexec/kdump架构的suspend3”为例,suspend3是Linux内核中的一种挂起机制,它能将系统状态保存到磁盘,然后使系统进入低功耗状态,当需要时可以通过resume操作从磁盘恢复系统状态继续运行。 #### Android开发层面 在Android开发里,生命周期管理涉及到suspendresume的概念。Activity或Fragment从创建到销毁的过程管理中,会有suspendresume状态。当Activity被其他界面覆盖(如弹出对话框)时,Activity会进入suspend状态,暂停部分操作;当对话框关闭,Activity重新获得焦点时,就会进入resume状态继续运行。这与引用[2]中提到的生命周期管理概念相关。 #### Java编程层面 在并行Java编程领域,线程也有suspendresume的操作。不过,Java早期提供的线程suspend()resume()方法已被弃用,因为它们容易导致死锁等问题。引用[3]中提到要规避使用被弃用的线程方法,开发者需要使用其他方式来实现线程的暂停恢复,例如使用wait()、notify()notifyAll()方法,或者使用LockCondition接口来控制线程的状态。 ### 代码示例 以下是一个简单的Java示例,展示如何使用wait()notify()方法来模拟线程的suspendresume: ```java class Worker implements Runnable { private boolean suspended = false; private final Object lock = new Object(); @Override public void run() { while (true) { synchronized (lock) { while (suspended) { try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } // 线程正常执行的操作 System.out.println("Thread is running..."); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } public void suspend() { suspended = true; } public void resume() { synchronized (lock) { suspended = false; lock.notify(); } } } public class Main { public static void main(String[] args) { Worker worker = new Worker(); Thread thread = new Thread(worker); thread.start(); try { Thread.sleep(3000); worker.suspend(); System.out.println("Thread is suspended."); Thread.sleep(3000); worker.resume(); System.out.println("Thread is resumed."); } catch (InterruptedException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值