`

使用线程池以及FutureTask管理多线程任务

 
阅读更多
package com.ihuning.javase.demo.thread;

import java.util.concurrent.Callable;

public class GetSum implements Callable<Integer> {

	private Integer total;

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

	public Integer call() throws Exception {
		for (int i = 0; i < 10 - total; i++) {
//			System.out.println("["+Thread.currentThread().getName()+"]" + total);
			Thread.sleep(1000);
		}
		return total;
	}

}

 

package com.ihuning.javase.demo.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class FutureTaskAndExecutor {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		List<FutureTask<Integer>> list = new ArrayList<FutureTask<Integer>>();
		// 创建线程池,线程池的大小和List.size没有啥必然的关系,一般的原则是<=list.size,多出来浪费不好
		ExecutorService exec = Executors.newFixedThreadPool(5);

		List<Task> tasks = new ArrayList<Task>();

		for (int i = 1; i < 3; i++) {
			// 创建对象
			FutureTask<Integer> ft = new FutureTask<Integer>(new GetSum(i));
			// 添加到list,方便后面取得结果
			list.add(ft);
			// tasks.add(new Task(i,ft,false));
			// 一个个提交给线程池,当然也可以一次性的提交给线程池,exec.invokeAll(list);
			exec.submit(ft);
			// System.out.println("-submit the thread task.");
		}

		// 开始统计结果
		Integer total = 2;

		while (true) {
			System.out.println("-----------------------------");
			for (FutureTask<Integer> tempFt : list) {

				// System.out.print(tempFt + "\t");
				// System.out.println(tempFt.isDone());
				tempFt.get();
				if (tempFt.isDone()) {
					System.out.println("isDone---------------");
					total = total + tempFt.get();
				} else {
					System.out.println("--------------continue");
					continue;
				}

			}
			if (total < 0) {
				break;
			} else {
				Thread.sleep(1000);
			}
		}

		// int undoneCount = 0;
		// for(Task task : tasks)
		// {
		// if(!task.isDone())
		// {
		// undoneCount++;
		// }
		// }
		//
		//
		// while(undoneCount > 0)
		// {
		// for(Task task : tasks)
		// {
		// if(task.isDone())
		// {
		// continue;
		// }
		// else
		// {
		// if(task.getFutureTasks().isDone())
		// {
		// Integer result = task.getFutureTasks().get();
		// System.out.println("--result--: " + result );
		// task.setDone(true);
		// undoneCount--;
		// }
		// else
		// {
		// continue;
		// }
		// }
		// }
		// Thread.sleep(2000);
		// }

		// 处理完毕,一定要记住关闭线程池,这个不能在统计之前关闭,因为如果线程多的话,执行中的可能被打断
		exec.shutdown();
		// System.out.println(new Date() + "----shutdown the thread pool----");

	}
}

class Task {
	private int id;

	private FutureTask<Integer> futureTasks;

	private boolean done;

	public Task(int id, FutureTask<Integer> futureTasks, boolean done) {
		System.out.println("set id: " + id);
		this.id = id;
		this.futureTasks = futureTasks;
		this.done = done;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public FutureTask<Integer> getFutureTasks() {
		return futureTasks;
	}

	public void setFutureTasks(FutureTask<Integer> futureTasks) {
		this.futureTasks = futureTasks;
	}

	public boolean isDone() {
		return done;
	}

	public void setDone(boolean done) {
		this.done = done;
	}

}

 

 

 

 

分享到:
评论

相关推荐

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

    在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    ### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`FutureTask`进行深入探讨。`FutureTask`是Java并发库中的一个关键组件,它实现了`...

    Android中的线程池与任务队列

    线程池(ThreadPool)是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以避免因频繁创建和销毁线程而导致的性能开销,提高系统的资源利用率。在Android中,我们通常...

    26_多线程_第1天(Thread、线程创建、线程池)_讲义

    在Java编程语言中,多线程是并发执行任务的关键机制,极大地提高了程序的效率和响应速度。本讲义主要探讨了三个核心主题:Thread类、线程创建以及线程池。 1. **Thread类** Java中的`Thread`类是所有线程的基础,...

    futuretask用法及使用场景介绍

    如果使用同步计算,可能会导致主线程阻塞,而使用FutureTask可以将计算任务交给线程池执行,主线程可以继续执行其他任务,而不需要等待计算结果。 二、FutureTask的执行多任务计算的使用场景 FutureTask可以与...

    多线程发邮件

    在IT行业中,多线程技术是一项重要的编程技巧,特别是在处理并发任务时,它能显著提升程序的执行效率。本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将...

    Java线程池FutureTask实现原理详解

    Java线程池FutureTask实现原理详解是Java多线程编程中的一种重要机制,用于追踪和控制线程池中的任务执行。下面将详细介绍FutureTask的实现原理。 类视图 为了更好地理解FutureTask的实现原理,我们需要了解一些...

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

    `FutureTask`是线程池处理任务的一种方式,它不仅包含了一个`Runnable`或`Callable`任务,还提供了检查任务是否完成、获取结果、取消任务等能力。当我们提交一个`FutureTask`到线程池时,可以通过`Future`接口的方法...

    线程池技术研究与应用.pdf

    线程池是一种多线程处理形式,它是一种技术,用于管理执行多个任务时涉及的线程。这种技术在服务器软件中被广泛采用,因为它能够有效解决资源不足的问题,提高工作流引擎的响应速度,并显著提升系统性能。 线程池...

    android线程池案例

    在Android开发中,高效地管理线程是提升应用性能的关键之一。线程池是一种机制,它允许多个任务在后台并行执行,从而避免...通过深入理解并实践这个案例,开发者可以更好地理解和掌握多线程编程,提升应用的用户体验。

    Java多线程.pdf

    总结来说,Java多线程技术包括线程的创建、线程安全的保证以及线程池的使用。熟练掌握这些知识点对于开发高效、稳定的多线程应用程序至关重要。通过合理地使用线程和线程池,我们可以有效地利用系统资源,提高程序的...

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    在Android开发中,多线程是必不可少的一部分,特别是在执行耗时操作如网络请求、数据库操作等时,为了不...在给定的`AndroidFutureCallableDemo`示例中,可能就是展示了如何使用这些工具来处理Android中的多线程任务。

    java 多线程程序编写

    线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。Java的`ExecutorService`接口和`ThreadPoolExecutor`类是实现线程池的主要工具。线程池可以有效控制运行的线程数量,...

    Android多线程操作

    标题"Android多线程操作"和描述"Android多线程开发实例,对使用多线程的用户有一定的参考价值!"暗示我们将深入探讨Android中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...

    java并发(二十四)多线程结果组装

    在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...

    JAVA线程池应用.pptx

    它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池可以有效地控制系统中的线程数量,避免了因大量创建销毁线程导致的资源浪费。 #### 二、Java实例化...

    多线程-day01.docx

    在 Java 中,多线程是并发编程的重要概念,它允许程序同时执行多个任务,从而提高系统效率...在后续的学习中,我们将进一步探讨高级多线程技术,如线程池的优化、线程同步机制的使用,以及在实际应用中的秒杀系统实现。

    MultiThread_并发_java_线程池_

    在Java编程中,多线程和线程池是并发处理的核心技术,对于提高程序的执行效率和资源管理具有重要作用。本文将深入探讨标题"MultiThread_并发_java_线程池_"所涵盖的知识点,以及如何在实际编程中利用这些概念。 一...

    线程池介绍

    线程池的合理使用对于优化多线程程序的性能至关重要,需要根据系统的并发需求、任务性质等因素来选择合适的线程池类型和参数。同时,避免无限制地创建线程池,以免消耗过多系统资源,导致系统性能下降甚至崩溃。通过...

    安卓多线程大全

    在安卓开发中,多线程是一项至关重要的技术,它使得应用程序能够同时执行多个任务,提升用户体验,避免主线程被阻塞导致应用无响应(ANR)。本资源包"安卓多线程大全"全面覆盖了安卓平台上的多线程实现方法,包括...

Global site tag (gtag.js) - Google Analytics