1 FutureTasck 和 Callable
-
是JDK1.5之后,在JUC工具包提供了一个多线程工具类
-
在多线程应用中,a线程可以通过FutureTask和Callable了解b线程是否执行完毕以及b线程执行的结果。
-
可以实现两个线程之间的通信。
-
自定义线程类,实现Callable接口,重写call方法,该方法执行的功能就是之前线程run方法的功能,无非多了一个返回值即为线程执行结果
-
Callable类型的线程,不能直接被Thread执行,需要使用FutureTask进行包装
未来可以通过FutureTask获得执行的状态及执行的结果
public static void main(String[] args) throws InterruptedException, ExecutionException {
Callable<Integer> c = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Random r = new Random();
int sum = 0 ;
for(int i=1;i<=10;i++){
System.out.println(i);
int count = r.nextInt(3)+1 ; //[1,3]
sum += count ;
try {
Thread.sleep(count*1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
return sum ;
}
};
FutureTask ft = new FutureTask<>(c);
Thread t = new Thread(ft);
t.start();
for(int i=100;i<=105;i++){
System.out.println(i);
Thread.sleep(500);
}
//主线程想知道,此时t1线程是否执行完毕,如果执行完毕,其执行的结果是多少
//System.out.println(ft.isDone());
Object r = ft.get();
System.out.println("-------->" + r);
}
2 Timer定时任务
-
定时操作有两种
-
延迟n久执行,延迟到指定时间(执行一次)
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("今天晚上好好学习");
}
};
Date now = new Date(2024,8,20,17,00);
now.setTime( now.getTime() + 5000 );
System.out.println("----启动定时器----");
Timer t1 = new Timer();
//t1.schedule(task,now); //指定的时间开始执行任务
t1.schedule(task,5000); //指定延迟多长时间执行
2.每隔n久执行(执行多次)
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("今天晚上好好学习");
}
};
Date now = new Date(2024,8,20,17,00);
now.setTime( now.getTime() + 5000 );
System.out.println("----启动定时器----");
Timer t1 = new Timer();
//t1.schedule(task,now,2000); //指定的时间开始执行任务,一旦执行,每隔2秒重复执行
t1.schedule(task,5000,2000); //指定延迟多长时间执行,每隔2秒重复执行