方案1 使用Phaser
方案2 使用CyclicBarrier
package com.eyu.ahxy.module.common.config;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest4.MAX;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest4.NUM;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest4.phaser;
import java.util.concurrent.Phaser;
public class OneTwoOneTwoTest4 {
static int NUM = 0;
static int MAX = 6;
static Object LOCK = new Object();
static Phaser phaser = new Phaser(2);
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new ThreadTest4();
thread1.start();
Thread thread2 = new ThreadTest4();
thread2.start();
thread1.join();
thread2.join();
}
}
class ThreadTest4 extends Thread {
public void run() {
while (true) {
synchronized (phaser) {
NUM = NUM + 1;
System.err.println(NUM + " ====" + Thread.currentThread());
if (NUM >= MAX) {
break;
}
}
phaser.arriveAndAwaitAdvance();
}
};
}
package com.eyu.ahxy.module.common.config;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest5.MAX;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest5.NUM;
import static com.eyu.ahxy.module.common.config.OneTwoOneTwoTest5.cyclicBarrier;
import java.util.concurrent.CyclicBarrier;
public class OneTwoOneTwoTest5 {
static int NUM = 0;
static int MAX = 6;
static CyclicBarrier cyclicBarrier;
public static void main(String[] args) throws InterruptedException {
cyclicBarrier = new CyclicBarrier(2);
Thread thread1 = new ThreadTest5();
thread1.start();
Thread thread2 = new ThreadTest5();
thread2.start();
thread1.join();
thread2.join();
}
}
class ThreadTest5 extends Thread {
public void run() {
while (true) {
synchronized (ThreadTest5.class) {
NUM = NUM + 1;
System.err.println(NUM + " ====" + Thread.currentThread());
if (NUM >= MAX) {
break;
}
}
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
分享到:
相关推荐
Java批次处理(Java Batch)是Java EE平台中的一个重要组成部分,主要用来处理大量数据或执行重复性的任务。在Java批次8中,我们关注的是Java Batch API的最新改进和特性,这有助于提升应用程序的效率和可维护性。...
当程序运行时出现异常情况,如数组越界、空指针访问等,Java会自动抛出一个异常对象。异常处理的核心在于能够捕获这些异常,并做出适当的响应。 **异常分类**: - **内置异常**: 如`ArrayIndexOutOfBoundsException`...
16.3.3 执行时期读取注释信息 549 16.4 重点复习 551 16.5 课后练习 551 appendixa 如何使用本书项目 553 a.1 项目环境配置 554 a.2 打开案例 554 appendixb mysql入门 557 b.1 安装、设定mysql 558 ...
它允许Java程序通过JDBC API来执行SQL语句,实现对数据库的增删改查等操作。在这个"java_access_jdbc.zip"压缩包中,我们很可能是探讨如何使用Java的JDBC API来连接Microsoft Access数据库并进行数据查询,特别是...
Java开发面试题涵盖了许多核心知识点,包括数据库优化、SQL查询、事务处理、数据类型、查询性能分析、并发控制、数据库操作、JDBC、大数据处理、索引、存储过程、视图、数据库性能优化、Java运算符、循环结构、跳转...
函数是执行特定任务的代码块,可以在程序中多处调用以避免重复编写相同的代码。 #### 开发过程中需要提交的报告(南京大汉网络) **题目解析:** - **报告类型:** - 项目计划报告:概述项目的整体规划和目标。 ...
3. **Spark Streaming**:Spark Streaming是Spark处理实时数据流的组件,它将数据流分解为小批次,然后使用Spark Core进行快速处理。项目中可能包含创建DStream(Discretized Stream),设置窗口操作,以及实现复杂...
疫苗信息管理模块则涵盖了疫苗的生产厂家、批次、有效期等关键信息,便于追踪疫苗的来源和状态。接种记录管理模块记录每个接种者的接种时间、接种地点、疫苗种类等,以供后续统计和分析。预约功能是系统的一大亮点,...
Spark Streaming的核心是一个执行模型,这个执行模型基于微批处理(micro-batch processing)的概念,允许将实时数据流切分成小批次进行处理。下面将详细介绍Spark Streaming执行模型的知识点。 首先,Spark ...
在`JDBCBatchInsert.java`中,可以看到如何创建PreparedStatement对象,设置占位符,然后多次调用`addBatch()`添加不同的数据,最后调用`executeBatch()`执行批量插入。 2. **使用Statement的batchUpdate()** ...
【标题】"cg-java-project:CapGemini学员的核心Java项目2021年3月" 指的是一个由CapGemini公司为学员设计的核心Java编程项目,该项目可能旨在提升学员对Java语言的理解和实际应用能力,特别是针对2021年3月批次的...
Spout在Trident中必须是幂等的,即重复执行同一操作不会影响结果。 - **Stream Groupings**:Trident提供了多种分组策略,如shuffle grouping(随机分组)、fields grouping(字段分组)、global grouping(全局...
批处理主要用于处理大量数据,例如数据导入导出、定期报表生成、数据清洗等场景,它强调的是效率和可重复性。Spring Batch作为Spring Framework的一部分,提供了一套完整的批处理解决方案,包括事务管理、错误处理、...
这对于提高性能非常关键,因为重复计算相同的 RDD 需要消耗大量资源。 - 对于基于窗口的操作(如 `reduceByWindow` 和 `reduceByKeyAndWindow`)以及基于状态的操作(如 `updateStateByKey`),这种持久化是隐式...
Struts预加载数据的实现是Web开发中一种提高用户体验的技术,尤其在大数据量或复杂页面加载时,可以分批次提前获取部分数据,减轻用户等待时间。在这个“struts 预加载数据demo”中,我们将深入探讨如何使用Struts2...
在重复执行相同的SQL语句时,使用`PreparedStatement`比`Statement`更有效率。这是因为`PreparedStatement`会预先解析SQL语句,减少了解析时间。例如: ```java PreparedStatement pstmt = connection.prepare...