不使用线程池:多线程并发任务汇总结果demo

本文章仅作测试Thread.join()方法,用于借鉴一些普通场景并发并汇总结果的情况,如数据量大,分在相同结构,但不同名称的表的一个sql的查询,以提高查询效率。

线程数最好以真正运行的核数为准,参考:java.lang.Runtime的方法:int availableProcessors()

先上任务线程类代码,类似后台的service类

sleep()模拟业务执行的时间

public class JoinThread implements Runnable {
	
	private String name;
	private long seconds;

	private List<String> results = new ArrayList<>();

	public JoinThread(String name, long seconds) {
		super();
		this.name = name;
		this.seconds = seconds;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public long getSeconds() {
		return seconds;
	}

	public void setSeconds(long seconds) {
		this.seconds = seconds;
	}

	public List<String> getResults() {
		return results;
	}

	public void setResults(List<String> results) {
		this.results = results;
	}

	@Override
	public void run() {
		long start = System.currentTimeMillis();
		System.out.println(name + " start : " + start);
		try {
			for (long i = 0; i < seconds; i ++) {
				results.add(name + "-element(" + i + "):" + new Random().nextInt(123));
			}
			TimeUnit.SECONDS.sleep(seconds);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(name + " end, spent on : " + (System.currentTimeMillis() - start) / 1000 + "s");

	}
}

 

以下是测试主程序类

public class JoinApp {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		System.out.println("主程序开始 : " + start);
		JoinThread r1 = new JoinThread("Task1", 5);
		JoinThread r2 = new JoinThread("Task2", 6);
		JoinThread r3 = new JoinThread("Task3", 3);
		Thread t1 = new Thread(r1);
		Thread t2 = new Thread(r2);
		Thread t3 = new Thread(r3);

		t1.start();
		t2.start();
		t3.start();
		
		try {
			t1.join();
			t2.join();
			t3.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		long end = System.currentTimeMillis();

		System.out.println(r1.getName() + "结果:" + r1.getResults());
		System.out.println(r2.getName() + "结果:" + r2.getResults());
		System.out.println(r3.getName() + "结果:" + r3.getResults());
		
		List<String> all = new ArrayList<>();
		all.addAll(r1.getResults());
		all.addAll(r2.getResults());
		all.addAll(r3.getResults());
		System.out.println("主程序结束 : " + end + ",  spent on : " + (System.currentTimeMillis() - start) / 1000 + "s" + ", 总结果 : " + all);
	}
}

 

运行结果,供参考

经测试,最久的任务确实是6秒,而最终全部执行完也是6秒,说明并行执行是OK的

主程序开始 : 1614870443798
Task1 start : 1614870443800
Task3 start : 1614870443800
Task2 start : 1614870443800
Task3 end, spent on : 3s
Task1 end, spent on : 5s
Task2 end, spent on : 6s
Task1结果:[Task1-element(0):50, Task1-element(1):111, Task1-element(2):110, Task1-element(3):16, Task1-element(4):90]
Task2结果:[Task2-element(0):31, Task2-element(1):73, Task2-element(2):10, Task2-element(3):2, Task2-element(4):58, Task2-element(5):54]
Task3结果:[Task3-element(0):82, Task3-element(1):67, Task3-element(2):96]
主程序结束 : 1614870449801,  spent on : 6s, 总结果 : [Task1-element(0):50, Task1-element(1):111, Task1-element(2):110, Task1-element(3):16, Task1-element(4):90, Task2-element(0):31, Task2-element(1):73, Task2-element(2):10, Task2-element(3):2, Task2-element(4):58, Task2-element(5):54, Task3-element(0):82, Task3-element(1):67, Task3-element(2):96]

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值