您的位置 首页 java

java实现Callable接口,多线程执行任务,并获取返回数据

java编程中,创建一个新线程,有时需要获取新线程执行结果,再进行后续操作,这时实现Runnable接口或者继承Thread类就不满足要求了。

因此java封装了Callable接口,结合FutureTask类可以实现此类需求。

注意:FutureTask.run()并不会启动一个新线程。

 @Slf4j
public class HorseCallable implements Callable {
    @Override
    public Object call() throws Exception {
        log.info("我实现了callable接口,是一匹回调马,当前线程是:{}",Thread.currentThread().getName());
        Thread.sleep(3000);
        return "神奇的回调,线程是:"+Thread.currentThread().getName();
    }

    /**
     * 注意此用例中始终只有main线程一个人在跑,业界劳模
     * FutureTask.run并不会创建一个新线程
     * start才会创建一个新线程
     */
    public void runByMySelf(){

        FutureTask horseTask1 = new FutureTask(new HorseCallable());
        log.info("horseTask1开始跑了。");
        horseTask1.run();
        FutureTask horseTask2 = new FutureTask(new HorseCallable());
        log.info("horseTask2开始跑了。");
        horseTask2.run();
        try {
            Object horseTask1Call = horseTask1.get();
            log.info("线程{}在等待,horseTask1Call:{}",Thread.currentThread().getName(),horseTask1Call);
            Object horseTask2Call = horseTask2.get();
            log.info("线程{}在等待,horseTask2Call:{}",Thread.currentThread().getName(),horseTask2Call);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    /**
     * 手动创建两个线程运行方法
     */
    public void runByNewThread(){

        FutureTask horseTask1 = new FutureTask(new HorseCallable());
        log.info("horseTask1开始跑了。");

        Thread horseThread1 = new Thread(horseTask1);
        horseThread1.setName("回调马1");
        horseThread1.start();

        FutureTask horseTask2 = new FutureTask(new HorseCallable());
        log.info("horseTask2开始跑了。");
        Thread horseThread2 = new Thread(horseTask2);
        horseThread2.setName("回调马2");
        horseThread2.start();

        try {
            //获取callback的执行内容
            Object horseTask1Call = horseTask1.get();
            log.info("线程{}在等待,horseTask1Call:{}",Thread.currentThread().getName(),horseTask1Call);
            Object horseTask2Call = horseTask2.get();
            log.info("线程{}在等待,horseTask2Call:{}",Thread.currentThread().getName(),horseTask2Call);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        HorseCallable horseCallable = new HorseCallable();
        horseCallable.runByMySelf();
        horseCallable.runByNewThread();

        log.info("线程:{}跑完了。",Thread.currentThread().getName());
    }
}  

文章来源:智云一二三科技

文章标题:java实现Callable接口,多线程执行任务,并获取返回数据

文章地址:https://www.zhihuclub.com/171067.shtml

关于作者: 智云科技

热门文章

网站地图