java.util.concurrent之FutureTask

jdk介绍:可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。 

相当于新起一个线程去执行,不影响主线程其他代码执行,只不过获取线程结果时需要阻塞等待

代码如下:

package test;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class TestFutureTask {

	public static void main(String[] args) {
		class Result {
			private String str;
		}
		ExecutorService executorService = Executors.newCachedThreadPool();
		final Result result = new Result();
		FutureTask<Result> futureTask = new FutureTask<Result>(new Runnable() {
			public void run() {
				try {
					System.out.println("线程" + Thread.currentThread().getName() + "开始执行");
					Thread.sleep((long) (Math.random() * 10000));
					result.str = "sdsd";
					System.out.println("线程" + Thread.currentThread().getName() + "执行完成");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, result);

		try {
			System.out.println("准备开始执行子任务 ");
			executorService.execute(futureTask);
			Result r1 = futureTask.get();
			System.out.println("线程执行结果:" + r1.str);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		executorService.shutdown();
	}
}

执行结果如下:

准备开始执行子任务 
线程pool-1-thread-1开始执行
线程pool-1-thread-1执行完成
线程执行结果:sdsd


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在使用Java中的FutureTask类时,可能会遇到java.util.concurrent.FutureTask.report内存溢出的问题。 FutureTask是Java中Executor框架的一部分,用于表示一个异步计算任务。在执行计算任务时,可能会出现内存溢出的情况,这通常是由于以下原因引起的: 1. 任务计算量过大:如果计算任务需要处理大量的数据或执行复杂的操作,可能会导致内存使用过多,进而导致内存溢出。 2. 内存泄漏:如果在任务执行过程中有未正确释放的资源或对象引用,那么这些未释放的资源可能会一直保存在内存中,最终导致内存溢出。 解决这个问题的方法如下: 1. 优化任务计算:检查计算任务的实现代码,尝试减少计算量或改进计算逻辑,以降低内存使用量。可以通过合理使用数据结构、循环和递归等技巧来减少内存占用。 2. 调整内存配置:如果计算任务确实需要较大的内存空间,可以调整Java虚拟机的内存配置参数。可以增加-Xmx和-Xms等参数,以提供足够的内存空间给计算任务使用。 3. 检查内存泄漏:通过使用Java内存分析工具,如Eclipse Memory Analyzer等,来检查任务执行期间是否存在内存泄漏。如果发现泄漏问题,需要修复代码,确保资源和对象在不再使用时能够正确释放。 综上所述,当出现java.util.concurrent.FutureTask.report内存溢出的情况时,我们可以通过优化任务计算、调整内存配置和检查内存泄漏等方法来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值