-
线程等待join()
方法 | 说明 |
join() | 等待线程结束 |
join(long millis) | 等待线程结束,最多等milliis毫秒 |
join(long millis,int nanos) | 可以更高精度等待 |
代码如下:
package thread.threaddemo;
/**
* @Author: wenjingyuan
* @Date: 2022/11/07/21:45
* @Description:关于join的一个实例
*/
public class ThreadByJoin {
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(()->{
//张三上班
System.out.println("张三上班");
//张三正在上班
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//张三下班
System.out.println("张三下班");
});
t.start();
//等待线程t1结束之后,在执行后面的代码
t.join();
Thread thread=new Thread(()->{
//李四上班
System.out.println("李四上班");
//李四正在上班
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//李四下班
System.out.println("李四下班");
});
thread.start();
}
}
执行结果如下:
结论:
join():等待某个线程执行结束以后在执行后续的代码
优势:
1.相比于我们之前用的isActive()方法判断此时这个线程是否活跃,join()写法比较优雅
2.join()底层的实现是靠wait阻塞线程的执行,wait消耗CPU的资源较少
-
线程的终止
实现方式:
1)使用自定义的标识符来终止线程
(1)实现代码:
package thread.threaddemo;
/**
* @Author: wenjingyuan
* @Date: 2022/11/09/8:53
* @Description:使用自定义标识符的方式来终止线程
*/
public class ThreadByInterrupt {
private volatile static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(()->{
while(!flag){
System.out.println("正在转账...");
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("还好,差点误了大事");
});
thread.start();
Thread.sleep(1000);
//终止线程
System.out.println("有内鬼,终止交易");
flag=true;
}
}
执行结果:
2)使用interrupt()来终止线程
(2)代码如下:
package thread.threaddemo;
/**
* @Author: wenjingyuan
* @Date: 2022/11/09/11:09
* @Description:interrupt()方法
*/
public class ThreadInterrupt2 {
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(()->{
while(!Thread.currentThread().isInterrupted()){
// while(!Thread.interrupted()){
System.out.println("正在转账..");
}
System.out.println("险些误了大事!");
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
System.out.println("有内鬼,终止交易!");
}
}
执行结果如下:
其中,interrup需要配合Thread.interrupted和Thread.currentThread().isinterrupted进行使用,从而实现线程的终止,那么关于Thread.interrupted和Thread.currentThread().isinterrupted的区别,以下就是他们之间的区别:
(1)Thread.interrupted是全局的方法,在使用了一次以后,会清除原来的标识位,是属于静态方法,所有程序都可以直接调用的全局方法
(2)Thread.currentThread().isinterrupted是实例的方法,再进行了设置以后是不会进行改变的。
-
yield让出执行权
代码如下:
package thread.threaddemo;
/**
* @Author: wenjingyuan
* @Date: 2022/11/10/16:34
* @Description:yield让出执行权
*/
public class ThreadDemoYield {
public static void main(String[] args) {
Thread thread=new Thread(()->{
Thread cThread=Thread.currentThread();
for (int i = 0; i < 100; i++) {
Thread.yield();
System.out.println("执行的线程为:"+cThread.getName());
}
},"线程1");
thread.start();
Thread thread1=new Thread(()->{
Thread cThread=Thread.currentThread();
for (int i = 0; i < 100; i++) {
System.out.println("执行的线程为:"+cThread.getName());
}
},"线程2");
thread1.start();
}
}
执行结果如下:
结论:
yield方法会出让CPU执行权,让线程调度器重新调度线程,但还是有一定的几率再一次调用到出让CPU的线程上的,通过上面的执行结果,我们可以看到,线程1在调用了yield()方法之后 ,并不是说全部都不执行等到线程2结束以后再去执行,但总的来说,线程1因为调用yield()方法,很大一部分可能都是最后才执行结束的。
-
找到当前线程Thread.CurrentThread()
这个方法我们已经非常熟悉了,在之前的操作里总是会遇见,调用该方法拿到的是当前线程的一个实例。