JAVA多线程机制之暂停、恢复和停止

简介:

在JDK1.2以前的版本如果要实现线程的暂停、恢复和停止的方法分别是suspend()、resume()、stop()。但是从JDK1.2以后这些方法已经被遗弃,因为它们有可能造成严重的系统错误和异常。
首先suspend()方法不会释放线程所占用的资源。如果使用该方法将某个线程挂起,则可能会使其他等待资源的线程死锁。而resume()方法本身并无问题,但是不能独立于suspend()方法存在。
其次调用stop()可能会导致严重的系统故障。因为该方法会使线程立刻中断指令执行,不管这段方法是否执行完毕。如果这个线程正在做重要的操作,对程序的运行起着支撑作用,这时如果突然中断其执行则会导致系统崩溃。
现在,这些方法已经不适合挂起和终止线程了,但是可以在run()方法中设置一些标志,通过在线程内部检测标志判断并调用wait()方法和notify()方法操作线程的挂起、恢复和正常终止。
下面通过示例来演示这些操作。

/**
 * 线程控制
 * 
 * @author jianggujin
 *
 */
public class ThreadCtrlDemo extends Thread
{
   private final int STOP = -1;
   private final int SUSPEND = 0;
   private final int RUNNING = 1;
   private int status = 1;
   private long count = 0;

   public ThreadCtrlDemo(String name)
   {
      super(name);
   }

   @Override
   public synchronized void run()
   {
      // 判断是否停止
      while (status != STOP)
      {
         // 判断是否挂起
         if (status == SUSPEND)
         {
            try
            {
               // 若线程挂起则阻塞自己
               wait();
            }
            catch (InterruptedException e)
            {
               System.out.println("线程异常终止...");
            }
         }
         else
         {
            count++;
            System.out.println(this.getName() + "第" + count + "次运行...");
            try
            {
               Thread.sleep(100);
            }
            catch (InterruptedException e)
            {
               System.out.println("线程异常终止...");
            }
         }
      }
   }

   /**
    * 恢复
    */
   public synchronized void myResume()
   {
      // 修改状态
      status = RUNNING;
      // 唤醒
      notifyAll();
   }

   /**
    * 挂起
    */
   public void mySuspend()
   {
      // 修改状态
      status = SUSPEND;
   }

   /**
    * 停止
    */
   public void myStop()
   {
      // 修改状态
      status = STOP;
   }

   public static void main(String[] args)
   {
      ThreadCtrlDemo demo = new ThreadCtrlDemo("测试线程");
      demo.start();
      try
      {
         Thread.sleep(2000);
      }
      catch (InterruptedException e)
      {
         System.out.println("主线程异常终止...");
      }
      System.out.println("测试线程即将被挂起...");
      demo.mySuspend();
      try
      {
         Thread.sleep(1000);
      }
      catch (InterruptedException e)
      {
         System.out.println("主线程异常终止...");
      }
      System.out.println("测试线程即将被唤醒...");
      demo.myResume();
      try
      {
         Thread.sleep(1000);
      }
      catch (InterruptedException e)
      {
         System.out.println("主线程异常终止...");
      }
      System.out.println("终止测试线程...");
      demo.myStop();
      System.out.println("主线程终止...");
   }
}

运行结果:
测试线程第1次运行…
测试线程第2次运行…
测试线程第3次运行…
测试线程第4次运行…
测试线程第5次运行…
测试线程第6次运行…
测试线程第7次运行…
测试线程第8次运行…
测试线程第9次运行…
测试线程第10次运行…
测试线程第11次运行…
测试线程第12次运行…
测试线程第13次运行…
测试线程第14次运行…
测试线程第15次运行…
测试线程第16次运行…
测试线程第17次运行…
测试线程第18次运行…
测试线程第19次运行…
测试线程第20次运行…
测试线程即将被挂起…
测试线程即将被唤醒…
测试线程第21次运行…
测试线程第22次运行…
测试线程第23次运行…
测试线程第24次运行…
测试线程第25次运行…
测试线程第26次运行…
测试线程第27次运行…
测试线程第28次运行…
测试线程第29次运行…
测试线程第30次运行…
终止测试线程…
测试线程第31次运行…
主线程终止…

目录
相关文章
|
2天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
19 0
|
1天前
|
Java 数据库连接
深入理解Java异常处理机制
【4月更文挑战第24天】本文将探讨Java中的异常处理机制,包括异常的概念、分类、捕获和抛出等方面。通过深入了解异常处理机制,可以帮助我们编写更加健壮的程序,提高代码的可读性和可维护性。
|
1天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
5 0
|
1天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
1天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
11 0
|
2天前
|
监控 安全 Java
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
7 2
|
1天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
20 1
|
1天前
|
安全 Java
Java基础教程(15)-多线程基础
【4月更文挑战第15天】Java内置多线程支持,通过Thread类或Runnable接口实现。线程状态包括New、Runnable、Blocked、Waiting、Timed Waiting和Terminated。启动线程调用start(),中断线程用interrupt(),同步用synchronized关键字。线程安全包如java.util.concurrent提供并发集合和原子操作。线程池如ExecutorService简化任务管理,Callable接口允许返回值,Future配合获取异步结果。Java 8引入CompletableFuture支持回调。
|
2天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
8月前
|
Java 容器
Java——使用多线程模拟真实高并发业务并保证安全性(二)
Java——使用多线程模拟真实高并发业务并保证安全性(二)

热门文章

最新文章