Java并发编程系列之六:stop()、resume()和suspend()

标签: 并发编程
18人阅读 评论(0) 收藏 举报
分类:

这三个方法已经是jdk是过期的方法,为什么仍然要单独拿出来说呢?主要目的是理解jdk多线程API设计的初衷,理解并且更好使用线程API。那么就来说说这三个方法吧:stop方法用于终止一个线程的执行,resume方法用于恢复线程的执行,suspend方法用于暂停线程的执行要注意的resume方法需要和suspend方法配对使用,因为被暂停的线程需要执行恢复方法才能继续执行。

虽然这三个方法不在推荐使用,但是作为学习,我们可以深入研究下这三个方法的作用以及为什么不再推荐使用。

下面的代码首先创建一个打印线程,该线程完成的工作是每隔一秒钟打印当前时间,然后由主线程对该打印线程进行停止、暂停和恢复操作。

package com.rhwayfun.concurrency;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * Created by rhwayfun on 16-4-2.
 */
public class DeprecatedThreadMethod {

    public static void main(String[] args) throws InterruptedException {
        DateFormat format = new SimpleDateFormat("HH:mm:ss");
        Thread printThread = new Thread(new Runner(),"PrintThread");
        //设为守护线程
        printThread.setDaemon(true);
        //开始执行
        printThread.start();
        //休眠3秒,也就是PrintThread运行了3秒
        TimeUnit.SECONDS.sleep(3);
        //尝试暂停
        printThread.suspend();
        System.out.println("main thread suspend PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
        //将PrintThread进行恢复,继续输出内容
        printThread.resume();
        System.out.println("main thread resume PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
        //尝试终止PrintThread,停止输出内容
        printThread.stop();
        System.out.println("main thread stop PrintThread at " + format.format(new Date()));
        TimeUnit.SECONDS.sleep(3);
    }

    /**
     * 该任务实现每隔一秒打印信息
     */
    static class Runner implements Runnable{
        public void run() {
            DateFormat format = new SimpleDateFormat("HH:mm:ss");
            while (true){
                System.out.println(Thread.currentThread().getName() + " run at " + format.format(new Date()));
                //休眠一秒后继续打印
                SleepUtil.second(1);
            }
        }
    }
}

执行结果如下:

这里写图片描述

可能你会很惊讶,这与我们设想的输出结果如出一辙:首先打印线程运行3秒后,主线程暂停打印线程的执行,暂停3秒后,主线程正确地恢复了打印线程的执行,打印线程重新运行3秒后,主线程停止了打印线程的执行,程序结束。

我们可以看到,时间上还是完全吻合的,那么如此好用的方法为什么就不再推荐使用了呢?我们看看官方怎么说:

This method has been deprecated, as it is inherently deadlock-prone. If the target thread holds a lock on the monitor protecting a critical system resource when it is suspended, no thread can access this resource until the target thread is resumed. If the thread that would resume the target thread attempts to lock this monitor prior to calling resume, deadlock results. Such deadlocks typically manifest themselves as “frozen” processes.

简单地说主要是:suspend方法为例,该方法容易导致死锁,因为该线程在暂停的时候仍然占有该资源,这会导致其他需要该资源的线程与该线程产生环路等待,从而造成死锁。stop方法同样如此,该方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序在可能在工作状态不确定的情况下工作。


查看评论

我爱学Java之Thread中stop(),suspend(),resume()为什么不安全

当调用stop()方法时会发生两件事:1.即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能...
  • woaigaolaoshi
  • woaigaolaoshi
  • 2016-05-02 22:24:59
  • 1972

java thread的stop,suspend,resume等方法废弃的原因

如下是官方文档,先贴上,抽时间完善 Why Are Thread.stop, Thread.suspend,  Thread.resume and Runtime.runFinaliz...
  • gediseer
  • gediseer
  • 2016-12-23 09:23:30
  • 8933

为什么java线程不推荐调用stop,suspend,resume方法

http://blog.csdn.net/moshengtan/article/details/11771945
  • u011118321
  • u011118321
  • 2017-06-02 17:03:00
  • 250

为什么线程会放弃Suspend和Resume方法

记录一下,多久没看youku了哦,有斗鱼,有乐视,还有翻墙,真的很久没打开优酷了 百度一下, 说什么 “suspend()方法就是将一个线程挂起(暂停),resume()方法就是将一个挂起线程复...
  • avi9111
  • avi9111
  • 2016-04-25 02:34:13
  • 2097

关于Thread对象的suspend,resume,stop方法(已过时)

一、作用     对于老式得磁带录音机,上面都会有,暂停,继续,停止。Thread中suspend,resume,stop方法就类似。     suspend,使线程暂停,但是不会释放类似锁这...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2016-12-18 00:50:38
  • 2186

Java中为什么反对使用Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit?

Java中为什么反对使用Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit?...
  • loongshawn
  • loongshawn
  • 2016-11-04 14:05:41
  • 1686

java中,为什么弃用stop和suspend方法

一、stop和suspend方法作用 它们是Thread类的方法 stop:用来终止一个线程 suspend:用来阻塞一个线程直至另一个线程调用resume 二、弃用原因 stop天...
  • wwyl1001
  • wwyl1001
  • 2016-02-25 14:50:41
  • 636

java多线程(八)为什么弃用stop和suspend

初始的java版本中定义了一个stop方法来终止一个线程还定义了一个suspend方法来阻塞一个线程,直到另一个线程调用resume方法。这两个方法在Java SE 1.2之后就被弃用了,因为这两种方...
  • xingjiarong
  • xingjiarong
  • 2015-08-27 09:12:23
  • 5334

Java并发编程系列之八:stop()、resume()和suspend()

这三个方法已经是jdk是过期的方法,为什么仍然要单独拿出来说呢?主要目的是理解jdk多线程API设计的初衷,理解并且更好使用线程API。那么就来说说这三个方法吧:stop方法用于终止一个线程的执行,r...
  • jim_cainiaoxiaolang
  • jim_cainiaoxiaolang
  • 2017-04-24 10:24:04
  • 230

Java中的线程Thread方法之---suspend()和resume()

前篇说到了Thread中的join方法,这一篇我们就来介绍一下suspend()和resume()方法,从字面意义上可以了解到这两个方法是一对的,suspend()方法就是将一个线程挂起(暂停),re...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014-02-25 14:37:58
  • 15450
    个人资料
    持之以恒
    等级:
    访问量: 7213
    积分: 780
    排名: 6万+
    轻松一下
    文章存档
    最新评论