futureTask用法

原文鏈接:https://www.cnblogs.com/yanliang12138/p/9798654.html

futureTask用法

深入學習FutureTask  主要講解了如何去使用futureTask來創建多線程任務,並獲取任務的結果。

Callable接口:實現這個接口的類,可以在這個類中定義需要執行的方法和返回結果類型。

MyTask.java類

  

public class MyTask  implements Callable<Object>{    
    private String args1;
    private String args2;
    //構造函數,用來向task中傳遞任務的參數
    public  MyTask(String args1,String args2) {
        this.args1=args1;
        this.args2=args2;
    }
    //任務執行的動作
    @Override
    public Object call() throws Exception {
        
        for(int i=0;i<100;i++){
            System.out.println(args1+args2+i);
        }
        return true;
    }
}

 

 FutureTask使用方法

public static void main(String[] args) {
        MyTask myTask = new MyTask("11", "22");//實例化任務,傳遞參數
        FutureTask<Object> futureTask = new FutureTask<>(myTask);//將任務放進FutureTask裏
        //採用thread來開啓多線程,futuretask繼承了Runnable,可以放在線程池中來啓動執行
        Thread thread = new Thread(futureTask);
        thread.start();
        
        try {
            //get():獲取任務執行結果,如果任務還沒完成則會阻塞等待直到任務執行完成。如果任務被取消則會拋出CancellationException異常,
            //如果任務執行過程發生異常則會拋出ExecutionException異常,如果阻塞等待過程中被中斷則會拋出InterruptedException異常。
            boolean result = (boolean) futureTask.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

另外一種方式來開啓線程

ExecutorService executorService=Executors.newCachedThreadPool();
        executorService.submit(futureTask);
        executorService.shutdown();

多個任務,開啓多線程去執行,並依次獲取返回的執行結果

public static void main(String[] args) {    
        //創建一個FutureTask list來放置所有的任務
        List<FutureTask<Object>> futureTasks=new ArrayList<>();
        for(Integer i=0;i<10;i++){
            MyTask myTask=new MyTask(i.toString(), i.toString());
            futureTasks.add(new FutureTask<>(myTask));
        }
        
        //創建線程池後,依次的提交任務,執行
        ExecutorService executorService=Executors.newCachedThreadPool();
        for(FutureTask<Object> futureTask:futureTasks){
            executorService.submit(futureTask);
        }
        executorService.shutdown();
        
        //根據任務數,依次的去獲取任務返回的結果,這裏獲取結果時會依次返回,若前一個沒返回,則會等待,阻塞
        for(Integer i=0;i<10;i++){
            try {
                String flag=(String)futureTasks.get(i).get();
                System.out.println(flag);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章