`

futuretask例子

    博客分类:
  • java
 
阅读更多
http://hi.baidu.com/ecspell/item/776bd100a8be97d21ef046aa

java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算
FutureTask、ExecutorService 相关知识,请看java,API

一个使用FutureTask简单的例子:

package com.spell.threads;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
* 测试FutureTask的用法,如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask
*
* @author Administrator
*
*/
public class FutureTaskTest {

/**
* @param args
*/
public static void main(String[] args) {
CountNum cn = new CountNum(0);
//FutureTask<Integer> 这里的表示返回的是Integer
FutureTask<Integer> ft = new FutureTask<Integer>(cn);
Thread td = new Thread(ft);
System.out.println("futureTask开始执行计算:" + System.currentTimeMillis());
td.start();
System.out.println("main 主线程可以做些其他事情:" + System.currentTimeMillis());
try {
// futureTask的get方法会阻塞,知道可以取得结果为止
Integer result = ft.get();
System.out.println("计算的结果是:" + result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("取得分支线程执行的结果后,主线程可以继续处理其他事项");
}

}

class CountNum implements Callable {
private Integer sum;

public CountNum(Integer sum) {
this.sum = sum;
}

public Object call() throws Exception {
for (int i = 0; i < 100; i++) {
sum = sum + i;
}
// 休眠5秒钟,观察主线程行为,预期的结果是主线程会继续执行,到要取得FutureTask的结果是等待直至完成。
Thread.sleep(3000);
System.out.println("futureTask 执行完成" + System.currentTimeMillis());
return sum;
}

}运行的结果是:
futureTask开始执行计算:1280114852250
main 主线程可以做些其他事情:1280114852250
futureTask 执行完成1280114855250
计算的结果是:4950
取得分支线程执行的结果后,主线程可以继续处理其他事项


如果有多个FutureTask要执行批量运算,从而充分的利用多核CPU,可以参考下面的代码:

package com.spell.threads;

import java.util.ArrayList;
import java.util.List;
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;

/**
* 测试多核时代,充分的利用CPU来运算数据,并且处理返回的结果,学习API专用
*
* @author Administrator
*
*/
public class FutureTaskAndExecutor {

/**
* @param args
*/
public static void main(String[] args) {
List<FutureTask<Integer>> list = new ArrayList<FutureTask<Integer>>();
// 创建线程池,线程池的大小和List.size没有啥必然的关系,一般的原则是<=list.size,多出来浪费不好
ExecutorService exec = Executors.newFixedThreadPool(5);
for (int i = 10; i < 20; i++) {
// 创建对象
FutureTask<Integer> ft = new FutureTask<Integer>(new GetSum(i));
// 添加到list,方便后面取得结果
list.add(ft);
// 一个个提交给线程池,当然也可以一次性的提交给线程池,exec.invokeAll(list);
exec.submit(ft);
}

// 开始统计结果
Integer total = 0;
for (FutureTask<Integer> tempFt : list) {
try {
total = total + tempFt.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}

// 处理完毕,一定要记住关闭线程池,这个不能在统计之前关闭,因为如果线程多的话,执行中的可能被打断
exec.shutdown();
System.out.println("多线程计算后的总结果是:" + total);

}
}

/**
* 这个类很简单,就是统计下简单的加法(从1 到total)
*
* @author Administrator
*
*/
class GetSum implements Callable {
private Integer total;
private Integer sum = 0;

public GetSum(Integer total) {
this.total = total;
}

public Object call() throws Exception {
for (int i = 1; i < total + 1; i++) {
sum = sum + i;
}
System.out.println(Thread.currentThread().getName() + " sum:" + sum);
return sum;
}

}运行的结果是:
pool-1-thread-1 sum:120
pool-1-thread-1 sum:136
pool-1-thread-1 sum:153
pool-1-thread-1 sum:171
pool-1-thread-1 sum:190
pool-1-thread-2 sum:66
pool-1-thread-3 sum:78
pool-1-thread-4 sum:91
pool-1-thread-5 sum:105
多线程计算后的总结果是:1165
分享到:
评论

相关推荐

    FutureTask学习

    在上述例子中,我们创建了一个`Callable`任务,然后用`FutureTask`包装它,并提交给`ExecutorService`执行。`get()`方法被用来获取任务的结果。 总之,`FutureTask`是Java并发编程中用于异步计算的一个强大工具,它...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    下面是一个使用`ThreadPoolTaskExecutor`和`FutureTask`的例子: ```java ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) context.getBean("threadPoolTaskExecutor"); Callable&lt;Integer&gt; callable ...

    简谈java并发FutureTask的实现

    Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...

    java多线程并发编程例子

    7. **FutureTask**:`FutureTask`实现了`Future`接口,它表示一个异步计算的结果。你可以提交一个`Callable`给`Executor`,然后使用`FutureTask`来获取计算结果。`TestFutureTask.java`可能包含了如何使用`...

    android异步操作例子

    本例子将深入探讨如何在Android中进行异步操作,以提升用户体验。 首先,我们要了解Android的主线程,也称为UI线程,它的主要职责是处理用户交互和更新用户界面。任何长时间运行的操作(如网络请求、数据库操作或...

    java多线程返回值使用示例(callable与futuretask)

    在这个例子中,我们创建了一个`ExecutorService`来执行任务,然后创建了一个`FutureTask`,将`Callable`实例作为参数传入。`ExecutorService`执行`FutureTask`,`call()`方法在新线程中运行,返回一个字符串。通过...

    商业编程-源码-一个用多线程实现文件查找的例子.zip

    比如在Java中,可以使用`Thread`类或`Runnable`接口来创建线程,或者使用`FutureTask`与`ExecutorService`配合进行异步操作。Python中则有`threading`模块,C++有`std::thread`库等。 此外,多线程编程需要注意线程...

    Java分布式应用学习笔记05多线程下的并发同步器

    本篇文章将深入探讨Java中的并发同步器,并通过具体的例子来解释如何使用`FutureTask`来实现线程之间的协作。 #### 2. FutureTask简介 `FutureTask`是Java并发编程中非常重要的一个类,它是`Future`接口的一个具体...

    BlockingQueue队列自定义超时时间取消线程池任务

    在这个例子中,我们将任务放入`BlockingQueue`,然后在`submitTask`方法中等待任务完成或超时。超时后,我们尝试取消任务。这提供了一种灵活的方式来管理和控制异步任务,使其具备超时取消的能力。 总的来说,通过...

    安卓通过线程刷新view的例子

    5. **FutureTask**:可以与ExecutorService配合使用,返回一个Future对象,该对象可以用来获取任务的执行结果,适合在多个线程间同步。 6. **LiveData** 和 **ViewModel**(Android Architecture Components):...

    31 凭票取餐—Future模式详解.pdf

    然后,将Callable对象包装成一个FutureTask,FutureTask同时实现了Runnable接口,因此可以被线程执行。 2. Future的使用 示例代码中,创建了一个`FutureTask&lt;String&gt; cookTask`,它的构造函数接收一个Callable对象...

    Java多线程之Callable接口的实现

    在网上,看到了几个比较好的代码例子,例如: a. Callable任务借助FutureTask运行: public class CallableAndFutureTask { public static void main(String[] args) { Callable&lt;Integer&gt; callable = new ...

    java线程实例 各种小Demo

    3. 实现Callable接口与FutureTask:Callable接口的call()方法可以返回一个结果,FutureTask可以用于获取这个结果。这种方式适合需要返回值的多线程场景。 二、线程状态与控制 Java线程有五种状态:新建、可运行、...

    java-101

    在这个例子中,`MyTask`类定义了一个返回字符串的`call()`方法。 接下来,我们需要了解`FutureTask`。`FutureTask`是Java并发包(java.util.concurrent)中的一个类,它是一个可以取消的任务,同时也是一个`Future`...

    java线程的run()没有返回值怎么办?

    在这个例子中,`MyCallableTask`类实现了`Callable&lt;String&gt;`接口,`call()`方法会返回一个字符串。 接下来,你可以使用`FutureTask`或者`ExecutorService`来执行这个`Callable`任务: ```java import java.util....

    java-concurrent:java 并发编程例子

    `FutureTask`是Future和Callable的组合,可以作为ExecutorService的提交对象。 3. **线程局部变量ThreadLocal**:ThreadLocal为每个线程都提供了一个独立的变量副本,线程间的变量不会相互影响,常用于存储线程私有...

    Java多线程指南

    - 如时钟程序的例子所示,使用三个线程分别处理时、分、秒的显示,可以使程序更加简洁易懂。 **3. 简化异步事件的处理** - 异步处理可以避免阻塞问题,提高程序响应速度。例如,在网络服务器中,每个客户端连接都...

    多线程发邮件

    在这个例子中,使用了`Executors.newFixedThreadPool(int nThreads)`来创建一个固定大小的线程池。这意味着线程池会预先创建nThreads个线程,即使它们暂时没有任务可做,也不会立即终止,而是保持待命状态。这有助于...

    java Future 接口使用方法详解

    以下是一个使用`FutureTask`实现超时控制的例子: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); FutureTask&lt;String&gt; future = new FutureTask(new Callable() { public String call...

    Java并发编程实践-电子书-03章

    - **3.4.5 Future和FutureTask**:`Future`接口表示异步计算的结果,`FutureTask`是`Future`的一个具体实现,它代表一个可以取消的异步计算。 #### 3.5 显示锁 - **3.5.1 ReentrantLock**:可重入锁(`...

Global site tag (gtag.js) - Google Analytics