等待一个线程--join()
多线程之间并发执行,随机调度,但是join()的作用可以帮助我们控制线程结束的先后顺序。
join() 的优点
虽然我们可以通过sleep休眠来控制线程结束的顺序,但是我们设置时间来进行休眠等待的时候,由于无法确定时间线程执行的时间比我们设置的时间的长和短,导致出现没有必要的等待,或者线程没有完成,休眠会指定CPU等待的时间,导致CPU时间的浪费,而join()只会使当前的线程阻塞,直到任务的完成。
public class Demo12 {
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(()->{
for (int i = 0; i < 5; i++) {
System.out.println("Thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("结束");
});
t.start();
//意思为等到thread全部执行完,才开始执行main
t.join();
//得到一定的时间如果还没有等到thread执行完的话,就执行main
//t.join(2000);
System.out.println("main");
//Thread.sleep(3000);
}
}
我们可以观察一下线程


在main线程中t.join意思是让main线程等t线程先结束,当执行到t.join()使,main线程就会阻塞等待,一直到t线程执行完毕,join才会继续执行。
注:如果t线程一直不结束,join就会一直不执行
所以我们就要进行优化,给join加上最大的等待时间

如果2000毫秒之后,t线程还没有结束的话,那么就不进行等待开始执行main线程,(2000)就是最大的等待时间。
获得当前线程的引用
public static Thread currentThread()-获得当前线程的引用
public class ThreadDemo {
public static void main(String[] args) {
Thread thread = Thread.currentThread();
System.out.println(thread.getName());
}
}
休眠当前的线程
在设置休眠的过程中,我们需要保证的一点是我们设置的休眠时间,实际上是要大于参数设置的休眠时间的。
实质:代码调用sleep,相当于让出了CPU资源,等到时间到了的时候,需要操作系统内核,把线程重新调度到CPU上,才能继续执行。
sleep(0)的作用:
让出了当前的线程,放弃了CPU资源,等待操作系统重新调度。(把CPU让出,给别人更多的执行机会)
进程状态
1.就绪 2.阻塞
NEW:表示安排了工作还未开始执行。(new了Thread对象,还没start)
TERMINATED:工作完成了(内核中的线程已经结束了,但是Thread对象还在)
TIMED_WAITING:这几个都表示排队等着其他事情
- 指定时间阻塞
- 线程阻塞(不参与CPU调度,不继续执行了)
- 阻塞的时间是有上线的
public class Demo13 {
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(()->{
for (int i = 0; i < 5; i++) {
System.out.println("Thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println(t.getState());
t.start();
Thread.sleep(500);
System

最低0.47元/天 解锁文章
169万+

被折叠的 条评论
为什么被折叠?



