JAVA基础:FutureTasck 和 Callable、Timer定时任务

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定时任务

  • 定时操作有两种

  1. 延迟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秒重复执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值