记录于2021年11月16日
前言
以下介绍的两种方发的适用情景不同,可根据具体需求选择使用。
一、两种方法
1.方法一
用定时器去结束任务,设定最短结束时间,若任务执行耗时不记,那么最快会经过给定的时间后退出。若算上任务执行的时间,则最快会在(任务执行的时间+给定的时间)后退出,只有一个线程时可以使用此方法。
2.方法二
在本线程(任务为死循环)中等待另一个线程完成任务,当另一个任务完成,此线程结束,当在线程中执行一些计算而主线程又急需这个计算结果,或者是本线程需要在某些任务完成后立即执行时,可以使用本方法。
二、代码实例
1.方法一
(计数器数)*(定时器时间) = 线程最快结束时间:
class ThreadDead extends Thread{
@Override
public void run(){
int count = 0;
while(true){ //死循环
try{
if(++count==50) //计数器
break;
//在此可以定义需要完成的任务
Thread.sleep(20); //定时器
}catch(InterruptedException ie){
ie.printStackTrace(System.out);
}
}
System.out.println("线程任务完成!");
}
public static void main(String[] args){
new ThreadDead().start();
}
}
2.方法二
情景说明:现在有两个线程,一个负责拍摄且拍摄一段时间,假定1秒,一个负责播放,播放线程在拍摄线程没有结束之前需要一直运行,一旦拍摄线程结束,播放线程也要随之结束
代码如下:
public class ThreadDead2 {
volatile boolean isFinished = false; //轻量级锁,禁用CPU缓存,使变量的改变直接写入到内存
ThreadDead2(){
new Play().start(); //分别启动两个线程
new Shot().start();
}
class Play extends Thread{
@Override
public void run(){
while(true){
//你的任务在此定义
if(isFinished)
break;
}
System.out.println("播放任务结束!");
}
}
class Shot extends Thread{
@Override
public void run(){
try{
Thread.sleep(1000); //假设拍摄任务耗时1000ms
}catch(InterruptedException ie){
ie.printStackTrace(System.out);
}
System.out.println("拍摄任务完成!");
isFinished = true; //拍摄任务完成
}
}
public static void main(String[] args){
new ThreadDead2();
}
}
总结
若本文有不恰当的地方,望大佬留下评论及时指正。(~ ̄▽ ̄)~