线程的挂起和恢复 转载

Posted 静若飘絮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程的挂起和恢复 转载相关的知识,希望对你有一定的参考价值。

(1)概述:线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。在线程挂起后,可以通过重新唤醒线程来使之恢复运行。

         run() 和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat() 用于自动调用run(),这是Java的内在机制规定的。当一个线程进入“非可执行”状态,必然存在某种原因使其不能继续运行,这些原因可能是如下几种情况:
     A,通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。
     B,通过调用join()方法使线程挂起,如果某个线程在另一个线程t上调用t.join(),这个线程将被挂起,直到线程t执行完毕为止。
     C,通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。
(2)sleep()方法:是一个使线程暂时停止一段执行时间的方法,该时间由给定的毫秒数决定。下面演示一个使用sleep()方法的例子,如下。

[java] view plain copy
 
  1. class ThreadA extends Thread  
  2. {  
  3.     public void run(){  
  4.         System.out.println("ThreadA is running");  
  5.     }  
  6. }  
  7.   
  8. public class TestNew {  
  9.     public static void main(String[] args)throws InterruptedException {  
  10.         // TODO Auto-generated method stub  
  11.         ThreadA ta = new ThreadA();  
  12.         ta.start();  
  13.         ta.sleep(5000);  
  14.         System.out.println("TestNew is running");  
  15.     }  
  16. }  

     执行结果是:先ThreadA is running,5秒后,TestNew is running。有人会提出疑问:ta.sleep(5000);这个语句是ta线程睡眠了5秒,为什么执行结果是main这个主线程也睡眠了5秒?两者是两个独立的线程才对?原因是:在哪个线程里声明sleep,哪个线程睡眠,所以是主线程睡眠了5000毫秒=5秒。

(3)join()方法:能够使当前执行的线程停下来等待,直至join()方法所调用的那个线程结束,再恢复执行。例如如果有一个线程A正在运行,用户希望插入一个线程B,并且要求线程B执行完毕,然后再继续线程A,此时可以使用join()方法来完成这个需求。

[java] view plain copy
 
  1. public class TestNew extends Thread  
  2. {  
  3.     public static int a = 0;  
  4.     public void run(){  
  5.         for(int k = 0;k < 5;k ++){  
  6.             a = a + 1;  
  7.         }  
  8.     }  
  9.   
  10.     public static void main(String[] args)throws InterruptedException {  
  11.         // TODO Auto-generated method stub  
  12.         TestNew ta = new TestNew();  
  13.         ta.start();  
  14.         ta.join();  
  15.         System.out.println(String.valueOf(a));  
  16.     }  
  17. }  

       执行结果:5。ta线程执行完毕后,才会开始打印a。如果没有join(),则结果不一定是5,原因是ta线程跟main线程的执行顺序并不固定。
(4)wait()与notify()方法:wait()方法同样可以使线程进行挂起操作,调用了wait()方法的线程进入了“非可执行”状态,使用wait()方法有两种方式,例如:
thread.wait(1000);
或:
thread.wait();
thread.notify();
其中第一种方式给定线程挂起时间,基本上与sleep()方法用法相同。第二种方式是wait()与notify()方法配合使用,这种方式让wait()方法无限等下去,直到线程接收到notify()或notifyAll()消息为止。
     wait()、notify()、notifyAll()不同于其他线程方法,这3个方法是java.lang.Object类的一部分,所以在定义自己类时会继承下来。wait()、notify()、notifyAll()都被声明为final类,所以无法重新定义。
(5)suspend()与resume()方法
       有时更好地挂起方法是强制挂起线程,而不是为线程指定休眠时间,这种情况下由其他线程负责唤醒其继续执行,除了wait()与notify()方法之外,线程中还有一对方法用于完成此功能,这就是suspend()与resume()方法。thread.suspend();thread.resume(),线程thread在运行到suspend()之后被强制挂起,暂停运行,直到主线程调用thread.resume()方法时才被重新唤醒。
      Java2中已经废弃了suspend()和resume()方法,因为使用这两个方法可能会产生死锁,所以应该使用同步对象调用wait()和notify()的机制来代替suspend()和resume()进行线程控制。

 

摘自:JAVA程序设计自学手册

参考原文:http://blog.csdn.net/zhandoushi1982/article/details/5506597

以上是关于线程的挂起和恢复 转载的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )