保证线程的顺序
第一种:使用join
for (int i = 0; i < 10; i++){
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1线程");
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t2线程\n");
}
});
t1.start();
t1.join();
t2.start();
Thread.sleep(500);
}
第二种:使用单线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++){
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1线程");
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t2线程\n");
}
});
executor.submit(t1);
executor.submit(t2);
Thread.sleep(500);
}
executor.shutdown();
第三种:使用CountDownLatch计数器
for (int i = 0; i < 10; i++){
final CountDownLatch count = new CountDownLatch(1);
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1线程");
count.countDown();
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是t2线程\n");
}
});
t2.start();
t1.start();
Thread.sleep(500);
}
第四种:使用wait和notify控制
第五种:使用CyclicBarrier循环屏障
第六种:使用Semaphore信号量
第七种:使用消息队列等中间件,如zookeeper、kafka等
你问我为什么后面几种高大上的为什么没有例子,因为它们例子写起来代码有点多,如果没有使用过的同学一定要百度了解下,特别是CyclicBarrier和Semaphore,这两个是java后面新增的并发包中的类,好用不贵。不然都不好意思说自己精通java
总结
以上多种控制线程顺序的方法,可以根据不同的场景使用不同的方法。每种方法都有他们的使用场景,在不同的场景选择最合适的方法才能事半功倍。