Java 多线程多任务循环运行

本文详细探讨了如何在Java中使用多线程技术实现多任务的循环执行,包括线程池的创建、任务提交以及同步控制等关键点,旨在提升并发性能和系统资源利用率。
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 毫秒~~~~~~~~~~~~
Java 中,使用多线程执行 `for` 循环任务是一种常见的优化方式,能够有效利用多核 CPU 资源来提高程序的执行效率。以下是几种实现方式: ### 使用 `ExecutorService` 和 `Runnable` 通过 `java.util.concurrent.ExecutorService` 接口可以创建一个线程池,并提交多个任务到线程池中并行执行。这种方式适用于需要将 `for` 循环中的每个迭代任务分配给不同的线程处理。 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class ParallelForLoop { public static void main(String[] args) throws InterruptedException { int numberOfThreads = 5; ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads); for (int i = 0; i < 10; i++) { final int index = i; executorService.execute(new Runnable() { @Override public void run() { System.out.println("Task " + index + " is running on thread " + Thread.currentThread().getName()); } }); } executorService.shutdown(); executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } } ``` ### 使用 `Callable` 和 `Future` 如果每个循环任务需要返回结果,则可以使用 `Callable` 接口代替 `Runnable`,并通过 `Future` 获取任务执行的结果。 ```java import java.util.concurrent.*; public class CallableParallelLoop { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { final int index = i; Future<String> future = executorService.submit(new Callable<String>() { @Override public String call() throws Exception { return "Task " + index + " completed."; } }); System.out.println(future.get()); // 阻塞直到任务完成 } executorService.shutdown(); } } ``` ### 使用 `ForkJoinPool`(Java 8+) `ForkJoinPool` 是 Java 7 引入的一个支持分治任务的线程池,特别适合递归式或分块处理的任务。对于 `for` 循环任务,可以通过 `ForkJoinTask` 的子类 `RecursiveAction` 或 `RecursiveTask` 来实现。 ```java import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; public class ForkJoinParallelLoop extends RecursiveAction { private final int start; private final int end; private static final int THRESHOLD = 2; public ForkJoinParallelLoop(int start, int end) { this.start = start; this.end = end; } @Override protected void compute() { if (end - start <= THRESHOLD) { for (int i = start; i < end; i++) { System.out.println("Processing index: " + i + " on thread " + Thread.currentThread().getName()); } } else { int mid = (start + end) / 2; ForkJoinParallelLoop left = new ForkJoinParallelLoop(start, mid); ForkJoinParallelLoop right = new ForkJoinParallelLoop(mid, end); invokeAll(left, right); } } public static void main(String[] args) { ForkJoinPool forkJoinPool = new ForkJoinPool(); forkJoinPool.invoke(new ForkJoinParallelLoop(0, 10)); } } ``` ### 使用 Java 8 的 `parallelStream` 如果任务是数据密集型且没有复杂的依赖关系,可以直接使用 `parallelStream` 来简化代码,自动进行并行处理。 ```java import java.util.stream.IntStream; public class ParallelStreamExample { public static void main(String[] args) { IntStream.range(0, 10).parallel().forEach(i -> { System.out.println("Processing index: " + i + " on thread " + Thread.currentThread().getName()); }); } } ``` 上述方法可以根据具体场景选择使用,例如任务是否需要返回值、任务之间的依赖关系等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值