Java 多线程多任务循环运行

学习记录——SIMPACK生成轨道谱文件的方法 生成轨道谱文件的方法,可以用于实测轨道谱导入和自制轨道谱导入仿真 阅读详情
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ThreadManager {
	public List<Map<String, Object>> initList = new ArrayList<Map<String, Object>>();
	public int exit = 0;//0正常退出,-1异常退出
	public int countFlag = 3;//线程计数
	public static long count = 0;//加载次数计数器
	public boolean stop = false;//是否线程停止控制标识
	public String globalFlag = "";//控制标识位
	private ArrayList<WorkThread> workThreadList = new ArrayList<WorkThread>();////线程链表
	public ThreadManager(){
		Map<String,Object> map1 = new HashMap<String, Object>();
		Map<String,Object> map2 = new HashMap<String, Object>();
		Map<String,Object> map3 = new HashMap<String, Object>();
		map1.put("A",1);
		map1.put("B",2);
		map2.put("A", 1000);
		map2.put("B", 2000);
		map3.put("A", 21);
		map3.put("B", 22);
		initList.add(map1);
		initList.add(map2);
		initList.add(map3);
		for(int s=0;s<countFlag;s++){
			globalFlag +="0";
		}
		System.out.println("~~~初始化标识位:"+globalFlag);
	}
	public void start() {
		WorkThread 	worker;
		long startTime = new Date().getTime();
		long endTime = new Date().getTime();
		for (int i = 0; i < countFlag; ++i) {
			Map map = initList.get(i);
			worker = new WorkThread(this,i,map);
			workThreadList.add(worker);
			worker.start();//线程启动
		}
		
		while(!stop){
			boolean allFlag = true;
			for(int s=0;s<globalFlag.length();s++){
				if(globalFlag.charAt(s)!='1'){
					allFlag = false;
					break;
				}
			}
			if(allFlag){
				endTime = new Date().getTime();
				System.out.println("~~~~~~~~~~~~第 "+count+" 打印结束,总耗时:"+(endTime-startTime)+" 毫秒~~~~~~~~~~~~");
				try {
					Thread.sleep(3000);
				} catch (NumberFormatException e) {
					e.printStackTrace();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} 
				count++;
				//this.stop=true;
				clearGlobalFlag('0');
				startTime = new Date().getTime(); 
			}else{
				try {
					Thread.sleep(150);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}	
		}
		System.exit(this.exit);	
	}
	/**
	 * 清除标识位
	 */
	public synchronized void clearGlobalFlag(char c){
		char[] cst = new char[globalFlag.length()];
		for(int s=0;s<globalFlag.length();s++){
			cst[s] = c; 
		}
		globalFlag = new String(cst);
	}
	/**
	 * 修改指定位对应的标识符
	 * @param index
	 * @param c
	 * @return
	 */
	public synchronized boolean changeGlobalFlag(int index,char c){
		boolean bool = false;
		char[] cs = globalFlag.toCharArray();
		char[] cst = new char[cs.length];
		for(int s=0;s<cs.length;s++){
			if(s==index){
				cst[s] = c;
			}else{
				cst[s] = cs[s];
			}
		}
		globalFlag = new String(cst);
		bool = true;
		return bool;
	}
	public String getGlobalFlag(){
		return globalFlag;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {	
		ThreadManager threadManager = new ThreadManager();
		threadManager.start();
	}
	public int getExit() {
		return exit;
	}
	public synchronized void setExit(int exit) {
		this.exit = exit;
	}
}

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class WorkThread extends Thread{
    private ThreadManager threadManager;
    private Map<String, Object> map = new HashMap<String, Object>();
    private int index = 0;
    public WorkThread(ThreadManager threadManager,int index,Map<String, Object> map){
        this.threadManager=threadManager;
        this.index=index;
        this.map.putAll(map);
    }
    public void run() {
        while (!threadManager.stop) {
            int count = 0;
            long startTime = 0;
            long endTime = 0;
            String msg = "~~~ 线程"+index+" 打印Map信息";
            if(threadManager.getGlobalFlag().charAt(index)=='0'){
                startTime = new Date().getTime();
                System.out.println("--A--"+map.get("A")+"--B--"+map.get("B"));
                endTime = new Date().getTime();
                threadManager.changeGlobalFlag(index, '1');
                System.out.println("--耗时:"+(endTime-startTime)+" 毫秒");
            }else{
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }    
        }
    }
}
输出结果:
~~~初始化标识位:000
--A--1--B--2
--耗时:0 毫秒
--A--1000--B--2000
--耗时:0 毫秒
--A--21--B--22
--耗时:0 毫秒
~~~~~~~~~~~~第 0 打印结束,总耗时:154 毫秒~~~~~~~~~~~~
--A--1000--B--2000
--耗时:0 毫秒
--A--21--B--22
--耗时:0 毫秒
--A--1--B--2
--耗时:0 毫秒
~~~~~~~~~~~~第 1 打印结束,总耗时:150 毫秒~~~~~~~~~~~~
--A--1--B--2
--耗时:0 毫秒
--A--1000--B--2000
--耗时:0 毫秒
--A--21--B--22
--耗时:0 毫秒
~~~~~~~~~~~~第 2 打印结束,总耗时:150 毫秒~~~~~~~~~~~~
TEM图像处理实战指南:从基础操作到金属材料分析 本文提供了一份全面的透射电镜(TEM)图像处理实战指南,涵盖从基础操作到金属材料深度分析的全流程。重点讲解了TEM图像预处理、选区电子衍射(SAED)标定、高分辨像(HRTEM)分析及STEM图像应用等核心技能,并结合金属材料(如铝合金、钢)的析出相鉴定、位错分析和界面结构研究等实际案例,帮助研究者从原始数据中准确提取晶体结构、缺陷及成分信息。 阅读详情

相关推荐

MicroLogix1400编程(使用RSLogix 500 + RSLinx Classic Lite)

MicroLogix1400编程

noscallion的博客 1万+

在Java中如何确保在多线程情况下,所有线程都完成再继续执行任务?

在多线程环境下,需要保证线程安全,避免出现线程竞争和线程之间的互相干扰。在以上示例代码中,当每个 SQL 查询任务执行完毕后都将 CountDownLatch 计数器减 1,当计数器减为 0 时,主线程的 await() 方法返回,程序继续执行后面的逻辑,汇总所有 SQL 查询结果并进行处理。在主线程中,调用 CountDownLatch 的 await() 方法在所有 SQL 查询任务执行完成前阻塞线程,直到计数器减为 0 时,所有任务都已经执行完成可以继续往下执行,此时可以对查询结果进行汇总处理。

weixin_43394692的博客 6846

用Arduino+ESP32复现TDOA定位:低成本实现厘米级精度的完整教程

本文提供了一套利用Arduino和ESP32平台,结合NRF24L01+模块与GPS/PPS时间同步方案,低成本复现高精度TDOA(到达时间差)定位系统的完整教程。教程详细阐述了从硬件选型、天线阵列设计、时间同步实现到核心算法与多径抑制的实战步骤,旨在帮助开发者和硬件爱好者以可控成本实现厘米级精度的定位演示系统。

weixin_29084111的博客 162

java for循环内执行多线程

一、java用多线程来加快循环效率 Executors(线程池)、CountDownLatch(闭锁)

qq_38650613的博客 2万+

彻底解决0x80070005错误代码:全面分析与实战指南

0x80070005错误代码虽然令人头疼,但通过上述方法,我们完全有能力将其攻克。从检查磁盘空间、设置账号权限,到运行疑难解答和系统文件检查器,再到调整相关服务状态,每一步都是解决这一问题的关键。希望本文能为你提供有力的帮助,让你在使用Windows系统的过程中更加顺畅无忧。

nntxthml的博客 6933

硬件作品3----STM32F103RCT6最小系统板MCU配置

电路未调试成功,目前刚打板,后续需要补充或者改版另行注明。

weixin_58364194的博客 5561

java的线程知识怎么回答_Java 多线程编程知识详解

Java 给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守候线程...

weixin_29792607的博客 165

Element-UI全面入门与实战技巧

Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确

全世界的博客 2863

Java多个线程顺序循环执行的几种实现方式

文章目录ReentrantLock+Condition方式实现Synchronized+wait/notifyAll方式实现两者对比 ReentrantLock+Condition方式实现 public class ReentrantLock_Impl { private static final String FLAG_THREAD_1 = "ReentrantLock_Thread1"; private static final String FLAG_THREAD_2 = "Reen

小马快跑的博客 7076

室内无线传播损耗分析与传播模型验证课程设计

室内无线传播损耗分析与传播模型验证课程设计

a_zxswer的博客 187

PHP 网页游戏开发入门教程

我们还链接了一个名为 “game.js” 的 JavaScript 文件,稍后将在其中编写游戏逻辑。这只是一个简单的示例,但它演示了如何使用 PHP 和 JavaScript 开发一个基本的网页游戏。以下是一个示例游戏的源代码和解释。现在,您可以在浏览器中打开 “game.php” 文件,即可看到一个带有红色游戏角色的游戏板。在上述代码中,我们使用 JavaScript 创建了一个游戏角色元素,并将其添加到游戏板容器中。最后,我们需要将游戏元素的样式设置为绝对定位,以便能够正确地控制它们的位置。

KkowServer的博客 678

Java 实现多线程的四种方式 超详细

java线程池

PassionAnytime的博客 1万+

AMBA-AXI and ACE协议详解(十)

本章介绍了ACE协议中的Barrier事务机制,包括内存屏障和同步屏障两种类型。

Crazzy_M的博客 613

一篇很好的讲Thread的文章

FROM: http://www.j2me.org/yabbse/index.php?board=10;action=display;threadid=2482 J2ME and Multithreading« on: September 17, 2004, 04:40:54 am »---------------------------------------------------------

Mobile Game 1527

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java学习--多线程中使用匿名类

在多线程中我们可以使用 niminglei

liletian2104的专栏 513

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java多线程游戏仿真实例分享

这是一篇学习分享博客,这篇博客将会介绍以下几项内容: 1、如何让一个程序同时做多件事?(多线程的创建、多线程的应用、多线程的特点以及多线程的注意事项) 2、如何让小球在画面中真实地动起来?(赋予小球匀速直线、自由落体、上抛等向量运动) 3、多线程游戏仿真实例分享(飞机大战、接豆人、双线挑战三个游戏实例)

旭日东升的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JAVA多线程是什么

一、 什么是多线程: 我们现在所使用操作系统都是多任务操作系统(早期使用的DOS操作系统为单任务操作系统),多任务操作指在同一时刻可以同时做多件事(可以同时执行多个程序)。 多进程:每个程序都是一个进程,在操作系统中可以同时执行多个程序,多进程的目的是为了有效的使用CPU资源,每开一个进程系统要为该进程分配相关的系统资源(内存资源) 多线程:线程是进程内部比进程更小的执行单元(执行流|程序片段),每个线程完成一个任务,每个进程内部包含了多个线程每个线程做自己的事情,在进程中的所有线程共享该进程的资源; 主

qq_45022104的博客 4446

Java 多线程详细介绍

了解 Java 多线程对于创建快速高效的应用程序非常重要。通过使用多线程,您可以同时运行多个任务,从而使您的程序响应更快、更强大。线程同步、并发集合和执行器框架等关键思想有助于安全地管理多个线程。在上面的文章中,我们描述了有关 Java 多线程的所有细节。Java 多线程教程 – 常见问题解答Java 中的多线程是什么?Java 中的多线程是指程序同时执行多个线程的能力。这允许程序同时执行多个任务,从而提高性能和响应能力。为什么多线程在 Java 中很重要?

潜洋的专栏 1099

java(多线程入门)

学习一下入门级的多线程 学习多线程,先了解什么叫线程,什么叫进程 一般我们运行的程序都是进程级的,就是运行一个进程的意思,进程之下还有一群小弟叫线程,多个进程可以同时运作,多个线程也可以,但是一般我们只认识大哥,就是进程,所以用户一般不纠结这个,但是开发人员就不一样了,得知道,一个进程其实内部还有若干个线程,一般最少会有一个主线程,在java里对应的是main方法开启的main线程,这一段要强调的...

awei的blog 3150

异步、并行、多线程、多任务及相关概念全梳理

基础模型:异步解决阻塞问题,并行提升计算效率,多线程/多任务是操作系统层面的并发管理。进阶模型:协程、事件驱动、Actor模型等提供更细粒度的控制,适应不同场景需求。选型原则I/O密集型:异步+单线程(如Node.js)。CPU密集型:多线程+并行(如Java线程池)。实时响应:事件驱动+非阻塞I/O(如游戏引擎)。

程序猿视角 1455

Java 多线程

JAVA 多线程 多任务的概念: 当今的操作系统绝大部分都是基于多任务的操作系统; 多任务操作系统的最大特点,是可以同时运行多个程序; 由于操作系统支持时间片轮换算法,使得用户感觉多个程序在同时运行,似乎有多个CPU在起作用。 线程的概念: 运行在操作系统之上的每个应用程序,都会占用一个独立的进程(process),而进程内又允许运行多个线程(thread),这意味着一个程序可以同时执行多个任务的...

qq_44702678的博客 186

教妹学 Java:难以驾驭的多线程

多线程

沉默王二 6992

PHP多任务,并发并行,多线程,协程等知识点理解

对于单核处理器,多进程实现多任务的原理是让操作系统给一个任务每次分配一定的 CPU 时间片,然后中断、让下一个任务执行一定的时间片接着再中断并继续执行下一个,如此反复。 由于切换执行任务的速度非常快,给外部用户的感受就是多个任务的执行是同时进行的。 多进程的调度是由操作系统来实现的,进程自身不能控制自己何时被调度,也就是说: 进程的调度是由外层调度器抢占式实现的 而协程要求当前正...

weixin_30896763的博客 942

Thread线程的讲解(单线程、多线程、多任务、比较、用法、同步、线程安全)

多线程:多线程则指的是在单个程序中可以同时运行多个不同的线程执行不同的任务.线程是程序内的顺序控制流,只能使用分配给程序的资源和环境。多线程编程的目的,就是"最大限度地利用CPU资源",当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。一个进程可以包含一个或多个线程一个程序实现多个代码同时交替运...

疯狂的1024 2763

for循环改为多线程方式进行执行_教妹学 Java:难以驾驭的多线程

00、故事的起源“二哥,上一篇《集合》的反响效果怎么样啊?”三妹对她提议的《教妹学 Java》专栏很关心。“这篇文章的浏览量要比第一篇《泛型》好得多。”“这是个好消息啊,说明更多人接受了二哥的创作。”三妹心花怒放了起来。“也许没什么对比性。”“没有对比性?我翻看了一下二哥 7 个月前写的文章,是真的水啊,嘻嘻。”三妹卖了一个萌,继续说道,“说实话,竟然还有读者愿意看,真的是不可思议。”“...

weixin_31115195的博客 527

java 多线程 结果汇总_Java 多线程初级汇总

多线程概述抢占式多任务直接中断而不需要事先和被中断程序协商协作多任务被中断程序同意交出控制权之后才能执行中断多线程和多进程区别?本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据ThreadThread(Runnable target)构造有一个新的线程来调用指定的target的run()方法void start()启动这个线程,将引发调用run()方法void run()调用关联...

weixin_39750410的博客 253
上一篇: Java 线程安全:BlockingQueue(阻塞算法) VS ConcurrentLinkedQueue(非阻塞算法)
下一篇: Flume 原理和使用
romaticjun2011
博客等级 码龄15年 6粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值