多线程学习:如何改变线程执行顺序
程序员文章站
2022-03-08 22:37:46
...
方案1:join方法
作用:
把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
如在A线程的run方法中调用了,B.join()则A线程获取到当前对象的锁(A的锁),进入等待状态,直到B线程执行完毕,锁释放A线程继续执行
分析:
如main方法下有如下代码
T1.start();
T2.start();
T1.join();
T3.start();
则运行过程为,jvm启动main线程,mian线程顺序启动T1、T2两个线程,T1、t2交替
执行,此时执行T1.join 则会导致main线程获取到锁进入等待状态,直到线程T1结束,
然后main线程被唤醒,开始启动T3,T2、T3交替执行。
使用:
Thread T0 = new Thread();
T0.start();
T0.join(); -- 调用join方法,等待线程t执行完毕
T0.join(1); -- 要等待的最长时间(以毫秒为单位)
T0.join(1,1);-- 毫秒,微妙
源码:
同步方法,底层调用的时Object.wait()
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
public final native void wait(long timeout) throws InterruptedException;
案例
- 在main线程中join
Thread T0 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println("TO线程运行");
}
}
},"TO线程");
T0.start();
T0.join();
System.out.println("main 线程结束");
运行结果:
TO线程运行
TO线程运行
main 线程结束
- 其他线程中调用join()
Thread T0 = new Thread(new Runnable() {
@Override
public void run() {
Thread t0 = new Thread(()->{
for(int i=0;i<100;i++){
System.out.println("TO子线程运行");
}
},"T0子线程");
t0.start();
try {
t0.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0;i<100;i++){
System.out.println("TO线程运行");
}
}
},"TO线程");
T0.start();
T0.join();
System.out.println("main 线程结束");
运行结果为
T0子线程 TO线程 main 线程
推荐阅读
-
iOS中的多线程如何按设定顺序去执行任务详解
-
iOS中的多线程如何按设定顺序去执行任务详解
-
【Java多线程】过程并行执行,结果顺序返回
-
浅谈Python3多线程之间的执行顺序问题
-
java 多线程Callable和Runable执行顺序问题详解
-
vector和arraylist的区别面试题(教你保证多线程顺序执行)
-
Java 详解循环屏障CyclicBarrier如何实现多线程分段等待执行完成
-
java如何实现多线程的顺序执行
-
VC++中多线程学习(MFC多线程)一(线程的创建、线程函数如何调用类成员呢?如何调用主对话框的成员?、MFC中的工作线程和界面线程的区别)
-
php5如何实现多线程(多个函数异步执行)?