本文章仅作测试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]