ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> 其他编程教程 >> 多线程任务计算

齐发国际登录

来源:网络整理     时间:2018-11-01     关键词:

本篇文章主要介绍了" 多线程任务计算",主要涉及到方面的内容,对于其他编程教程感齐发国际游戏的同学可以参考一下: 最近在研究多线程任务计算可以有返回值,所以写了一个简单多线程任务计算的demo,代码如下:package thread;import java.util.Arr...

最近在研究多线程任务计算可以有返回值,所以写了一个简单多线程任务计算的demo,代码如下:

package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class DuoRenWuJiSuanTest {
    public static void main(String[] args) throws Exception {
    	long startTime = System.currentTimeMillis();
        // 创建任务集合
        List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>();
        // 创建线程池
        ExecutorService exec = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            // 传入Callable对象创建FutureTask对象
            FutureTask<Integer> ft = new FutureTask<Integer>(new ComputeTask(i+""));
            taskList.add(ft);
            // 提交给线程池执行任务,也可以通过exec.invokeAll(taskList)一次性提交所有任务;
            exec.submit(ft);
        }
        System.out.println("所有计算任务提交完毕, 主线程接着干其他事情!");
        // 开始各计算线程计算结果
        Integer totalResult = 0;
        for (FutureTask<Integer> ft : taskList) {
            try {
                //FutureTask的get方法会自动阻塞,直到获取计算结果为止
                totalResult = totalResult + ft.get();
//                totalResult = totalResult + ft.get(1000,TimeUnit.MILLISECONDS);//等待一秒获取结果,子线程没有执行完则抛出异常
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        // 关闭线程池
        exec.shutdown();
        System.out.println("多任务计算后的总结果是:" + totalResult+";话费时间:"+(endTime-startTime));
    }
}
class ComputeTask implements Callable<Integer> {
    private Integer result = 0;
    private String taskName = "";
    public ComputeTask(String taskName){
        this.taskName = taskName;
        System.out.println("生成子线程计算任务: "+taskName);
    }
    public String getTaskName(){
        return this.taskName;
    }
    @Override
    public Integer call() throws Exception {
        for (int i = 1; i <= 100; i++) {
            result += i;
        }
        // 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。
        Thread.sleep(new Random().nextInt(5000));
        System.out.println(Thread.currentThread().getName()+"子线程计算任务: "+getTaskName()+" 执行完成!");
        return result;
    }
}

 代码的核心就是创建List<FutureTask<Integer>> 进行线程任务的计算结果的接收。然后再循环使用futureTask.get()方法来进行结果的获取。要注意的是get方法会阻塞主线程,所以主线程会等待所有线程的计算结果完成之后在进行求和处理。一定要注意的是 FutureTask是Future接口的实现类

以上就介绍了 多线程任务计算,包括了方面的内容,希望对其他编程教程有齐发国际游戏的朋友有所帮助。

本文网址链接:http://www.machineofchina.com/article/detail_4596257.html

相关图片

相关文章