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

2966

被折叠的 条评论
为什么被折叠?



