通過Callable接口實現多線程


一.通過Callable接口實現多線程

c.實現Callable重寫call方法
實現Callable和實現Runnable類似,但是功能更強大,具體表現在
a.可以在任務結束后提供一個返回值,Runnable不行
b.call方法可以拋出異常,Runnable的run方法不行
c.可以通過運行Callable得到的Fulture對象監聽目標線程調用call方法的結果,得到返回值,(fulture.get(),調用后會阻塞,直到獲取到返回值)

1.Callable接口介紹:

(1)java.util.concurrent.Callable是一個泛型接口,只有一個call()方法

(2)call()方法拋出異常Exception異常,且返回一個指定的泛型類對象

2.Callable接口實現多線程的應用場景

(1)當父線程想要獲取子線程的運行結果時

3.使用Callable接口實現多線程的步驟

(1)第一步:創建Callable子類的實例化對象

(2)第二步:創建FutureTask對象,並將Callable對象傳入FutureTask的構造方法中

(注意:FutureTask實現了Runnable接口和Future接口)

 (3)第三步:實例化Thread對象,並在構造方法中傳入FurureTask對象

 (4)第四步:啟動線程

例1(利用Callable接口實現線程):

利用Callable接口創建子線程類:

package com.my.frame;

import java.util.concurrent.Callable;

public class ThreadCall implements Callable<String> {

    @Override
    public String call() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("=====");
        return "9999";
    }


}
package com.my.frame;

import java.util.concurrent.FutureTask;

public class TestThread {
    public static void main(String[] args) {
        
        FutureTask<String> ft = new FutureTask<>(new ThreadCall());
        new Thread(ft).start();
    }

}

例2(匿名類部類實現Callable接口創建子線程):

匿名類部類實現Callable接口創建子線程類並實現:

package call;

 

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

//匿名類部類實現Callable接口創建子線程

public class AnonyCallable {

 

    public static void main(String[] args) {

    Callable<String> cl = new Callable<String>() {

     

    @Override

    public String call() throws Exception {

            System.out.println(Thread.currentThread().getName() + "正在行軍~~~");

            System.out.println(Thread.currentThread().getName() + "遭遇敵軍~~~");

            System.out.println(Thread.currentThread().getName() + "奮勇殺敵!!!!");

            return "戰斗勝利,俘虜敵軍50000人";

            }

 

};

        FutureTask<String> ft = new FutureTask(cl);

        new Thread(ft, "李存孝部隊").start();

try {

        Thread.currentThread().setName("李存勖部隊");

        Thread.sleep(3000);

        System.out.println(Thread.currentThread().getName() + "休整3000ms");

} catch (InterruptedException e) {

    e.printStackTrace();

}

    System.out.println(Thread.currentThread().getName() + "整頓完畢,等待友軍消息...");

try {

            String str = ft.get();

            System.out.println("李存勖部隊得知友軍消息為:" + str);

} catch (InterruptedException | ExecutionException e) {

    e.printStackTrace();

    }

}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM