多线程有返回值

来源:互联网 发布:json的parse方法 编辑:程序博客网 时间:2024/06/07 20:57
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class MultiFutureThread {
    
    public static void main(String[] args) {
        
        int sizeNum = 5;
        // 创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(sizeNum);
        
        ArrayList<Future<String>> results = new ArrayList<Future<String>>();
        try {
            for (int i = 0 ;i < sizeNum; i++) {
                
                CallThread t = new CallThread(i);
                // 执行任务并获取Future对象
                Future f = pool.submit(t);
                results.add(f);
                
                //如果这里加上返回的值,在线程变为一个个开启,可能会卡,还会出现下一个线程会等到上一个线程开启完再执行
                //System.out.println("各个线程的值:" + f.get().toString());
            }
        
            pool.shutdown();
        
            // 获取所有并发任务的运行结果
            for (Future f : results) {
                
                // 从Future对象上获取任务的返回值,并输出到控制台
                System.out.println("关闭线程池后,各个线程的值:" + f.get().toString());
            }    
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}



import java.util.concurrent.Callable;

/**
 * 开启线程,返回值
 */
public class CallThread implements Callable<Object>{
    
    private int numberThread;
    
    public CallThread(int numberThread) {
        
        this.numberThread = numberThread;
    }
    @Override
    public Object call() throws Exception {
        
        System.out.println("线程 : " + numberThread + "开启");
        
        return numberThread;
    }
}


1.输出结果 (在开启线程时候获取返回值)

线程 : 0开启
各个线程的值:0
线程 : 1开启
各个线程的值:1
线程 : 2开启
各个线程的值:2
线程 : 3开启
各个线程的值:3
线程 : 4开启
各个线程的值:4
关闭线程池后,各个线程的值:0
关闭线程池后,各个线程的值:1
关闭线程池后,各个线程的值:2
关闭线程池后,各个线程的值:3
关闭线程池后,各个线程的值:4


2.输出结果 (最后才获取线程值)

线程 : 0开启
线程 : 1开启
关闭线程池后,各个线程的值:0
关闭线程池后,各个线程的值:1
线程 : 2开启
关闭线程池后,各个线程的值:2
线程 : 3开启
关闭线程池后,各个线程的值:3
线程 : 4开启
关闭线程池后,各个线程的值:4






原创粉丝点击