当前位置: 首页 > article >正文

第三百二十一节 Java线程教程 - Java线程状态、Java原子变量

Java线程教程 - Java线程状态

停止,挂起和恢复线程

下面的代码演示了如何模拟Thread类中的stop(),suspend()和resume()方法。

public class Main extends Thread {
  private volatile boolean keepRunning = true;
  private boolean suspended = false;
  public synchronized void stopThread() {
    this.keepRunning = false;
    this.notify();
  }

  public synchronized void suspendThread() {
    this.suspended = true;
  }

  public synchronized void resumeThread() {
    this.suspended = false;
    this.notify();
  }

  public void run() {
    System.out.println("Thread started...");
    while (keepRunning) {
      try {
        System.out.println("Going to sleep...");
        Thread.sleep(1000);
        synchronized (this) {
          while (suspended) {
            System.out.println("Suspended...");
            this.wait();
            System.out.println("Resumed...");
          }
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) throws Exception {
    Main t = new Main();
    t.start();
    Thread.sleep(2000);
    t.suspendThread();
    Thread.sleep(2000);
    t.resumeThread();
    Thread.sleep(2000);
    t.stopThread();
  }
}

上面的代码生成以下结果。

Java线程教程 - Java原子变量

新线程并发包

java.util.concurrent和java.util.concurrent.atomic和java.util.concurrent.locks包括非常有用的并发构造。

线程并发包以四种方式支持并发。

  • 原子变量
  • 同步器
  • 并发集合

原子变量

原子变量类的命名类似于AtomicXxx,例如,AtomicInteger类用于表示一个int变量。

原子变量可用于在不使用任何锁的情况下以原子方式对单个变量执行多个指令。

  • 标量原子变量类

    AtomicInteger,AtomicLong和AtomicBoolean类分别支持对原始数据类型int,long和boolean的操作。

    当引用变量需要以原子方式更新时,AtomicReference类用于处理引用数据类型。

  • 原子数组类

    有三个类称为AtomicIntegerArray,AtomicLongArray和AtomicReferenceArray,它们表示一个int,long和引用类型的数组,其元素可以进行原子性更新。

  • 原子字段更新程序类

    有三个类称为AtomicLongFieldUpdater,AtomicIntegerFieldUpdater和AtomicReferenceFieldUpdater,可用于使用反射以原子方式更新类的易失性字段。

    要获得对这些类的对象的引用,您需要使用他们的工厂方法newUpdater()。

  • 原子复合变量类

例子

以下代码显示如何使用AtomicLong类来创建计数器。

import java.util.concurrent.atomic.AtomicLong;

public class AtomicCounter {
  private AtomicLong value = new AtomicLong(0L);

  public long next() {
    return value.incrementAndGet();
  }
}

http://www.kler.cn/a/390525.html

相关文章:

  • spring中r类是什么
  • 黄色校正电容102j100
  • 如何提高自动驾驶中惯性和卫星组合导航pbox的精度?
  • 【CICD】GitLab Runner 和执行器(Executor
  • sql server启用远程连接与修改默认端口
  • html+js+css实现拖拽式便签留言
  • 2024.11最新Hexo+GitHub搭建个人博客
  • 网络安全渗透测试的相关理论和工具
  • dhcp和ftp
  • 设计模式之模版方法模式(Template)
  • 在CentOS下安装RabbitMQ
  • Nginx、Gateway的区别
  • TCP 三次握手意义及为什么是三次握手
  • 基于Testng + Playwright的H5自动化巡检工具
  • 【含文档】基于Springboot+Vue的生鲜团购系统 (含源码数据库+lw)
  • Arrays.sort与Collections.sort:深入解析Java中的排序算法
  • PySpark 数据处理实战:从基础操作到案例分析
  • 开源 - Ideal库 -获取特殊时间扩展方法(三)
  • MySQL 中单列索引与联合索引分析
  • SCI论文为何有“Online版”和“正式出版”?这两者有什么区别?
  • 字符函数和字符串函数(函数的模拟实现请前往gitte获取源代码)(文章结尾有链接)
  • PyQt入门指南五十一 文档与注释规范
  • Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
  • c语言数据结构与算法--简单实现队列的入队和出队
  • 如何提高自动驾驶中惯性和卫星组合导航pbox的精度?
  • 钉钉扫码登录(DTFrameLogin) 用户注销后重新登录出现回调叠加的问题