Java 多線程 返回值

一)背景

該案例主要是結合多線程、ThreadPoolExecutor線程池實現的一個有返回值的多線程功能。

 

二)第一個線程類

創建一個ListThread線程類,繼承java.util.concurrent.Callable接口,並指定方法具體的返回值類型。

實現源碼:

package com.oysept.thread;

import java.util.List;
import java.util.concurrent.Callable;

/**
 * ListThread線程類, 繼承Callable接口
 * @author ouyangjun
 */
public class ListThread implements Callable<String> {
	
    private List<Object> list;
	
    /** 初始化list, 傳值可各種各 樣*/
    public ListThread(List<Object> list) {
        this.list = list;
    }

    /** 返回字符串,也可以把對象轉化成json字符串返回 */
    public String call() throws Exception {
        // 做具體的業務邏輯
        for (Object obj : list) {
            System.out.println("ListThread==>list: " + obj);
        }
        return "ListThread OK!";
    }
}

 

三)第二個線程類

創建一個MapThread線程類,繼承java.util.concurrent.Callable接口,並指定方法具體的返回值類型。

實現源碼:

package com.oysept.thread;

import java.util.Map;
import java.util.concurrent.Callable;

/**
 * MapThread線程類, 繼承Callable接口
 * @author ouyangjun
 */
public class MapThread implements Callable<String> {

    private Map<String, Object> map;
	
    /** 初始化map, 傳值可各種各樣 */
    public MapThread(Map<String, Object> map) {
        this.map = map;
    }
	
    /** 返回字符串, 也可以把對象轉化成json字符串返回 */
    public String call() throws Exception {
        // 做具體的業務邏輯
        for (String key : map.keySet()) {
            System.out.println("MapThread==>map.key: " + key + ", map.value: "+ map.get(key));
        }
        return "MapThread OK!";
    }
}

 

四)線程方法測試類

package com.oysept.thread;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 多線程測試類
 * @author ouyangjun
 */
public class ThreadPool {
	
    /**
     * 默認的線程池,指定線程池默認大小,也可以指定具體的線程池,如上面的註釋代碼
     * Executors.newCachedThreadPool();        //創建一個緩衝池,緩衝池容量大小爲Integer.MAX_VALUE
     * Executors.newSingleThreadExecutor();    //創建容量爲1的緩衝池
     * Executors.newFixedThreadPool(int);      //創建固定容量大小的緩衝池
     */
    private ThreadPoolExecutor poolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
	
    public static void main(String args[]) {
        // 執行測試方法
        new ThreadPool().exec();
    }
	
    public void exec() {
        List<Object> list = new ArrayList<Object>();
        list.add("oysept111111");
        list.add(222222);
        list.add(333333);
        list.add(444444);
        ListThread listThread = new ListThread(list);
		
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("555555", "oysept111111");
        map.put("666666", 222222);
        map.put("777777", 333333);
        map.put("888888", 444444);
        MapThread mapThread = new MapThread(map);
		
        // 執行
        Future<String> resQingStor = poolExecutor.submit(listThread); // 提交多線程任務
        Future<String> resRemedy = poolExecutor.submit(mapThread); // 提交多線程任務
        try {
            String listStr = resQingStor.get(); // 獲取線程方法的返回值
            String mapStr = resRemedy.get(); // 獲取線程方法的返回值
            System.out.println("==>ThreadPoolExecutor處理成功!,listStr="+listStr+",mapStr="+mapStr);
        } catch (InterruptedException e) {
            System.out.println("InterruptedException異常: "+e);
        } catch (ExecutionException e) {
            System.out.println("ExecutionException異常: "+e);
        }
    }
}

打印效果圖:

 

識別二維碼關注個人微信公衆號

本章完結,待續,歡迎轉載!
 
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!

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