`
747017186
  • 浏览: 331533 次
社区版块
存档分类
最新评论

多线程任务计算

    博客分类:
  • java
 
阅读更多

最近在研究多线程任务计算可以有返回值,所以写了一个简单多线程任务计算的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接口的实现类

分享到:
评论

相关推荐

    多线程多任务下载软件.zip易语言项目例子源码下载

    在这个“多线程多任务下载软件.zip”压缩包中,包含的是一个易语言项目的源码,可以作为学习和参考的实例。下面将详细解释多线程和多任务下载的概念,以及如何在易语言中实现这些功能。 1. **多线程技术**:在...

    易语言多线程任务分配模块源码

    在易语言中,多线程任务分配模块是实现并发处理的关键组件,尤其适用于处理耗时操作或者提高程序执行效率。本模块的源码提供了一个简单而实用的多线程解决方案。 首先,我们要理解什么是多线程。在计算机科学中,...

    C++ 多线程求PI

    在C++编程中,多线程技术是一种提升程序性能的有效方式,特别是在计算密集型任务中,如求解圆周率(PI)。这个项目名为“C++ 多线程求PI”,其目标是利用多线程并行计算来提高求解PI的效率。Word文档中的思路可能...

    多线程计算

    多线程计算是一种在计算机程序中同时执行多个线程(执行序列)的技术,它能够充分利用现代多核处理器的计算能力,提高程序的并发性和效率。在处理大量数据、实时响应或者进行复杂运算时,多线程是不可或缺的工具。...

    计算多线程环境下执行任务时间1

    测试代码应该包含调用`time()`方法,传递一个`ExecutorService`实例、并发度(`concurrency`)和要执行的`Runnable`任务,以验证该方法是否正确计算了多线程环境下的执行时间。 总的来说,`CountDownLatch`是Java...

    多线程计算pi(精确到多位)

    在IT领域,多线程计算是一种利用多个处理器核心或线程并行处理任务的技术,能够显著提高计算效率,尤其在需要进行大量计算的任务中,如计算圆周率π的值。"多线程计算pi(精确到多位)"这个项目正是基于这样的理念,...

    易语言多线程执行任务例程

    在“content.txt”文件中,可能包含了具体的易语言多线程编程示例代码,通过分析和学习这些代码,我们可以更好地理解如何在易语言环境中实现和管理多线程任务。对于初学者而言,这是一份宝贵的资源,可以加深对多...

    多线程执行任务具体实现

    此外,多线程还能提高用户体验,例如,一个线程处理用户界面更新,另一线程则负责后台数据计算,避免了用户界面的卡顿。 二、Java中的多线程实现 1. 继承Thread类:创建一个新的类,继承自Thread类,重写run()方法...

    单线程 多线程 线程池 计算随机数的一价和

    在计算机科学中,多线程和线程池是并发编程中的关键概念,它们极大地提高了程序的执行效率,尤其是在处理大量计算任务时。本主题将详细探讨单线程、多线程以及线程池,并结合计算随机数的一价和来阐述这些概念的实际...

    pthread多线程求pi,linux多线程pthread,C,C++

    在IT领域,多线程是一种常见且强大的编程技术,它允许多个任务同时执行,以提高程序的效率和响应速度。在Linux系统中,`pthread`库是C和C++编程语言实现多线程的标准接口。本文将深入探讨标题和描述中提到的...

    Qt 之多线程处理多任务

    在Qt框架中,多线程处理多任务是提高应用程序性能和响应能力的重要手段。Qt提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...

    Arduino 使用多线程例子

    标题中的“Arduino 使用多线程例子”意味着我们将探讨如何在Arduino平台上实现多任务并行处理。通常,Arduino基于单片机,不直接支持操作系统或内置的多线程机制。但是,通过巧妙编程和使用库,我们可以模拟多线程的...

    多线程矩阵乘法计算

    而利用多线程,我们可以将这个任务分解成多个小任务,每个线程负责计算矩阵的一部分,从而充分利用现代多核处理器的并行计算能力,显著提高效率。 在Java中实现多线程矩阵乘法,首先需要创建一个线程池,例如使用`...

    如何实现多线程多任务?

    在计算机编程中,多线程和多任务是提高应用程序效率和响应能力的重要技术。本文将深入探讨如何在C++环境中,特别是在MFC(Microsoft Foundation Classes)框架下实现多线程多任务。 首先,理解“多线程”和“多任务...

    通过多线程任务处理大批量耗时业务并返回结果

    标题中的"通过多线程任务处理大批量耗时业务并返回结果"指的是在Java或其他支持多线程的编程语言中,如何有效地分配工作到多个线程,以便同时处理大量任务,并在任务完成后收集和处理结果。 描述中提到的"当监测到...

    C#多线程多任务管理模型.zip

    在C#编程中,多线程和多任务管理是一个关键的概念,它允许程序同时执行多个独立的任务,提高程序的响应速度和效率。本压缩包文件"**C#多线程多任务管理模型**"提供了相关的代码示例和项目资源,帮助开发者深入理解和...

    演示多线程计算和进度条

    多线程则允许多个任务同时运行,主线程负责UI交互,而其他线程负责后台计算,从而提高效率并保持UI的响应性。在C#中,可以使用`System.Threading`命名空间下的`Thread`类或者`Task`类来创建和管理线程。 接下来是...

    Java多线程矩阵相乘的代码

    在矩阵相乘中,多线程的使用通常是为了将大任务分解为小任务,然后分配给不同的线程进行计算,从而提高计算速度。例如,一个500x500的矩阵乘法可以被划分为25000个小的2x2矩阵相乘,这些小任务可以并行执行。这里,...

Global site tag (gtag.js) - Google Analytics