线程挂起和恢复的几种方法

本文详细介绍了Java中线程挂起和恢复的四种方法:sleep()方法使线程进入等待状态;join()方法让调用线程等待目标线程执行完毕再执行;wait()和notify()方法常用于线程间的同步;而suspend()和resume()方法虽然已废弃,但解释了它们的工作原理和替代方案。

线程挂起和恢复方法(1):sleep()方法

此种方法比较简单,哪个线程需要挂起就在哪个线程中直接调用:Thread.sleep(挂起的毫秒数);

线程挂起和恢复方式(2):join()方法

实现多线程的两种方法这篇博文中值说明了Thread类中join()的作用如下:

join():用线程对象调用,如果在一个线程A中调用另一个线程B的join方法,线程A将会等待线程B执行完毕后再执行。

光看这句话或许还没有特别明白,没有给出例子,这篇博文就用例子的形式介绍下这个函数的作用。

先看如下代码:

package com.wrh.threadInterrupt;

public class TestThread implements Runnable{
    private static int num=0;
    public static void main(String[] args) {
        Thread t=new Thread(new TestThread());
        t.start();//开启一个子线程
        System.out.println(num);
    }

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            num++;
        }
    }

}
/*
运行结果会是多少呢?是1吗,是2吗,还是10吗???
答案是:不确定的。因为这个线程的调用机制有关系,可能只是启动了子线程还没有执行子线程中的语句就切回到了main线程,这样的输出结果就是 0;可能启动了子线程并凯斯执行了for循环中的语句但是for循环还没有执行完就切换会main线程,这样可能就会输出1~9中的一个数字。也可能启动了子线程并执行完了所有的语句然后切换会main线程,这样输出的语句就是10.


但如何使得我们的输出一定为  10呢??
这就需要利用join这个方法了,看如下一段代码。

*/

仅仅就在上一段代码的基础上加了如下一行代码:t.join();就使得输出一定为 10

package com.wrh.threadInterrupt;

public class TestThread implements Runnable{
    private static int num=0;
    public static void main(String[] args) {
        Thread t=new Thread(new TestThread());
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(num);
    }

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            num++;
        }
    }

}

通过上面的例子,相信都能够明白:join()方法的含义了,好好配合程序代码理解下这句话。

join():用线程对象调用,如果在一个线程A中调用另一个线程B的join方法,线程A将会等待线程B执行完毕后再执行。
即在A线程的代码中调用了b.join( ),则线程A会被挂起,直至线程b运行完为止才会继续运行。

线程挂起和恢复方法(3):wait()与notify()方法

wait()方法同样可以使线程进行挂起操作,调用了wait()方法的线程进入了“非可执行”状态,使用wait()方法有两种方式,例如:
thread.wait(1000);
或:
thread.wait();
thread.notify();
其中第一种方式给定线程挂起时间,基本上与sleep()方法用法相同。第二种方式是wait()与notify()方法配合使用,这种方式让wait()方法无限等下去,直到线程接收到notify()或notifyAll()消息为止。

线程挂起和恢复方法(3):suspend()与resume()方法

有时更好地挂起方法是强制挂起线程,而不是为线程指定休眠时间,这种情况下由其他线程负责唤醒其继续执行,除了wait()与notify()方法之外,线程中还有一对方法用于完成此功能,这就是suspend()与resume()方法。thread.suspend();thread.resume(),线程thread在运行到suspend()之后被强制挂起,暂停运行,直到主线程调用thread.resume()方法时才被重新唤醒。

不过,在Java2中已经废弃了suspend()和resume()方法,因为使用这两个方法可能会产生死锁,所以应该使用同步对象调用wait()和notify()的机制来代替suspend()和resume()进行线程控制。

为解决suspend()与resume()方法带来的死锁问题,正确的方法是:通过设置标志位,让线程在安全的位置挂起
关于如何设置标志位:可以参考这篇博文:http://blog.csdn.net/ns_code/article/details/17095733

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值