详解java线程的开始、暂停、继续

发布时间 - 2026-01-10 22:16:21    点击率:

Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。

直接在主线程中,通过wait、notify、notifyAll去控制读文件的线程(子线程),报错:java.lang.IllegalMonitorStateException。

需要注意的几个问题:

  1. 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
  2. 无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)。
  3. 如果在没有控制权的线程里执行对象的以上三种方法,就会报错java.lang.IllegalMonitorStateException。
  4. JVM基于多线程,默认情况下不能保证运行时线程的时序性。

线程取得控制权的3种方法:

  1. 执行对象的某个同步实例方法。
  2. 执行对象对应类的同步静态方法。
  3. 执行对该对象加同步锁的同步块。

这里将开始、暂停、继续封装在线程类中,直接调用该实例的方法就行。

public class ReadThread implements Runnable{
  public Thread t;
  private String threadName;
  boolean suspended=false;
  public ReadThread(String threadName){
   this.threadName=threadName;
   System.out.println("Creating " + threadName );
  }
  public void run() {
   for(int i = 10; i > 0; i--) {
   System.out.println("Thread: " + threadName + ", " + i);
   // Let the thread sleep for a while.
   try {
    Thread.sleep(300);
    synchronized(this) {
     while(suspended) {
      wait();
     }
    }
   } catch (InterruptedException e) {
    System.out.println("Thread " + threadName + " interrupted.");
    e.printStackTrace();
   }
   System.out.println("Thread " + threadName + " exiting.");
   }
  }
  /**
   * 开始
   */
  public void start(){
   System.out.println("Starting " + threadName );
   if(t==null){
    t=new Thread(this, threadName);
    t.start();
   }
  }
  /**
   * 暂停
   */
   void suspend(){
   suspended = true;
  }
   /**
   * 继续
   */
   synchronized void resume(){
    suspended = false;
    notify();
   }
 }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# java  # 线程  # 开始  # 暂停  # 继续  # Java 线程池框架  # java 线程详解及线程与进程的区别  # Java中终止线程的三种方法  # Java多线程--让主线程等待所有子线程执行完毕在执行  # java多线程实现服务器端与多客户端之间的通信  # java 多线程-锁详解及示例代码  # Java多线程之异步Future机制的原理和实现  # 深入理解JAVA多线程之线程间的通信方式  # Java线程间的通信方式详解  # Java线程的基本概念  # 报错  # 就会  # 在此  # 就行  # 三种  # 任何一个  # 种方法  # 需要注意  # 装在  # 多线程  # 类中  # 取得了  # 情况下  # 直接调用  # ReadThread  # public  # class  # brush  # pre 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  使用Dockerfile构建java web环境  青岛网站建设如何选择本地服务器?  Firefox Developer Edition开发者版本入口  香港服务器租用费用高吗?如何避免常见误区?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何用美橙互联一键搭建多站合一网站?  bing浏览器学术搜索入口_bing学术文献检索地址  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何用PHP工具快速搭建高效网站?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  js代码实现下拉菜单【推荐】  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何快速建站并高效导出源代码?  Python文件流缓冲机制_IO性能解析【教程】  Internet Explorer官网直接进入 IE浏览器在线体验版网址  音乐网站服务器如何优化API响应速度?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  北京网站制作的公司有哪些,北京白云观官方网站?  ,网页ppt怎么弄成自己的ppt?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  python中快速进行多个字符替换的方法小结  Laravel如何创建自定义Facades?(详细步骤)  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  在线教育网站制作平台,山西立德教育官网?  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  如何在搬瓦工VPS快速搭建网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  利用vue写todolist单页应用  Laravel如何生成URL和重定向?(路由助手函数)  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何在阿里云虚拟主机上快速搭建个人网站?  网页设计与网站制作内容,怎样注册网站?  Laravel如何发送系统通知?(Notification渠道示例)  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何基于云服务器快速搭建网站及云盘系统?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel中的Facade(门面)到底是什么原理  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出