JAVA多线程之线程的挂起与恢复(suspend方法与resume方法)

一,介绍

本文讨论JAVA多线程中,使用 thread.suspend()方法暂停线程,使用 thread.resume()恢复暂停的线程 的特点。

先介绍二个关于线程的基本知识:

①线程的执行体是run()方法里面的每一条语句,main线程执行的则是main()方法里面的语句。

②Thread.sleep()方法 使当前正在执行的线程睡眠。

 

二,suspend()方法

①当某个线程的suspend()方法被调用时,该线程会被挂起。如果该线程占有了锁,则它不会释放锁。即,线程在挂起的状态下还持有锁。

②suspend()已经是一个过时的方法了。

来分析一段代码:

复制代码
public class MyThread extends Thread {

    private long i = 0;

    public long getI() {
        return i;
    }

    public void setI(long i) {
        this.i = i;
    }

    @Override
    public void run() {
        while (true) {
            i++;
            System.out.println(i);//同步方法
        }
    }

}            
复制代码

 

复制代码
 1 public class Run {
 2 
 3     public static void main(String[] args) {
 4 
 5         try {
 6             MyThread thread = new MyThread();
 7             thread.start();//启动一个线程'thread'
 8             Thread.sleep(1000);//使当前线程(main线程)睡眠
 9             thread.suspend();//挂起线程'thread'
10             System.out.println("main end!");
11         } catch (InterruptedException e) {
12             e.printStackTrace();
13         }
14     }
15 
16 }
复制代码

在第8行,睡眠的线程是main线程。这样第7行启动的线程'thread'就有机会获得CPU执行,于是:MyThread类的run()方法中的代码就执行了。

当main线程睡眠了1秒钟并重新获得了CPU执行时,执行到第9行。

在第9行,让 第7行中启动的线程 suspend(挂起)。

于是,'thread'线程就不会再打印i的值了。然后,main线程继续执行到第10行,准备打印"main end!"

但是,由于System.out.println(...),它是一个同步方法,PrintOut的println(Object o)的源代码如下:

复制代码
 1  /**
 2      * Prints an Object and then terminate the line.  This method calls
 3      * at first String.valueOf(x) to get the printed object's string value,
 4      * then behaves as
 5      * though it invokes <code>{@link #print(String)}</code> and then
 6      * <code>{@link #println()}</code>.
 7      *
 8      * @param x  The <code>Object</code> to be printed.
 9      */
10     public void println(Object x) {
11         String s = String.valueOf(x);
12         synchronized (this) {
13             print(s);
14             newLine();
15         }
16     }
复制代码

可以看出,在第12行,需要先获得当前PrintOut对象的锁。

而由于此时,MyThread类的线程'thread'是挂起的。它的run()方法里面也有打印语句。因此,它占有的PrintOut的对象锁没有释放。

从而导致main线程无法执行Run.java中的第10行,打印输出语句。

 

注意 PrintOut是System类中的一个静态属性,System类中只有唯一的一个PrintOut对象,System类中相关源代码如下:

复制代码
 /**
     * The "standard" output stream. This stream is already
     * open and ready to accept output data. Typically this stream
     * corresponds to display output or another output destination
     * specified by the host environment or user.
     * <p>
     * For simple stand-alone Java applications, a typical way to write
     * a line of output data is:
     * <blockquote><pre>
     *     System.out.println(data)
     * </pre></blockquote>
     * <p>
     * See the <code>println</code> methods in class <code>PrintStream</code>.
     */
    public final static PrintStream out = null;
复制代码

 

三,resume()方法

该方法很功能很简单,就是恢复 因suspend()方法挂起的线程,使之重新能够获得CPU执行。

本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5449667.html,如需转载请自行联系原作者

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> 欢迎参加英特尔® OpenVINO™工具套件初级课程 !本课程面向零基础学员,将从AI的基本概念开始,介绍人工智能与视觉应用的相关知识,并且帮助您快速理解英特尔® OpenVINO™工具套件的基本概念以及应用场景。整个课程包含了视频的处理,深度学习的相关知识,人工智能应用的推理加速,以及英特尔® OpenVINO™工具套件的Demo演示。通过本课程的学习,将帮助您快速上手计算机视觉的基本知识和英特尔® OpenVINO™ 工具套件的相关概念。 </p> <p> 为保证您顺利收听课程参与测试获取证书,还请您于<strong>电脑端</strong>进行课程收听学习! </p> <p> 为了便于您更好的学习本次课程,推荐您免费<strong>下载英特尔® OpenVINO™工具套件</strong>,下载地址:https://t.csdnimg.cn/yOf5 </p> <p> 收听课程并完成章节测试,可获得本课程<strong>专属定制证书</strong>,还可参与<strong>福利抽奖</strong>,活动详情:https://bss.csdn.net/m/topic/intel_openvino </p> <p> 8月1日-9月30日,学习完成【初级课程】的小伙伴,可以<span style="color:#FF0000;"><strong>免费学习【中级课程】</strong></span>,中级课程免费学习优惠券将在学完初级课程后的7个工作日内发送至您的账户,您可以在:<a href="https://i.csdn.net/#/wallet/coupon">https://i.csdn.net/#/wallet/coupon</a>查询优惠券情况,请大家报名初级课程后尽快学习哦~ </p> <p> <span style="font-size:12px;">请注意:点击报名即表示您确认您已年满18周岁,并且同意CSDN基于商务需求收集并使用您的个人信息,用于注册OpenVINO™工具套件及其课程。CSDN和英特尔会为您定制最新的科学技术和行业信息,将通过邮件或者短信的形式推送给您,您也可以随时取消订阅不再从CSDN或Intel接收此类信息。 查看更多详细信息请点击CSDN“<a href="https://passport.csdn.net/service">用户服务协议</a>”,英特尔“<a href="https://www.intel.cn/content/www/cn/zh/privacy/intel-privacy-notice.html?_ga=2.83783126.1562103805.1560759984-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">隐私声明</a>”和“<a href="https://www.intel.cn/content/www/cn/zh/legal/terms-of-use.html?_ga=2.84823001.1188745750.1560759986-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">使用条款</a>”。</span> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页