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; } }
相关推荐
在Java的多线程编程中,Spring框架提供了一种便捷的方式来管理和配置线程池,这就是`ThreadPoolTaskExecutor`。这个类是Spring对Java内置的`java.util.concurrent.ThreadPoolExecutor`的封装,允许开发者在Spring...
### Java多线程与并发(17-26)-JUC线程池-FutureTask详解 #### 一、概述 本文将围绕Java多线程与并发中的重要概念——`FutureTask`进行深入探讨。`FutureTask`是Java并发库中的一个关键组件,它实现了`...
线程池(ThreadPool)是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以避免因频繁创建和销毁线程而导致的性能开销,提高系统的资源利用率。在Android中,我们通常...
在Java编程语言中,多线程是并发执行任务的关键机制,极大地提高了程序的效率和响应速度。本讲义主要探讨了三个核心主题:Thread类、线程创建以及线程池。 1. **Thread类** Java中的`Thread`类是所有线程的基础,...
如果使用同步计算,可能会导致主线程阻塞,而使用FutureTask可以将计算任务交给线程池执行,主线程可以继续执行其他任务,而不需要等待计算结果。 二、FutureTask的执行多任务计算的使用场景 FutureTask可以与...
在IT行业中,多线程技术是一项重要的编程技巧,特别是在处理并发任务时,它能显著提升程序的执行效率。本示例“多线程发邮件”就是利用了这一特性,通过并发执行多个邮件发送任务,来加快邮件的发送速度。下面我们将...
Java线程池FutureTask实现原理详解是Java多线程编程中的一种重要机制,用于追踪和控制线程池中的任务执行。下面将详细介绍FutureTask的实现原理。 类视图 为了更好地理解FutureTask的实现原理,我们需要了解一些...
`FutureTask`是线程池处理任务的一种方式,它不仅包含了一个`Runnable`或`Callable`任务,还提供了检查任务是否完成、获取结果、取消任务等能力。当我们提交一个`FutureTask`到线程池时,可以通过`Future`接口的方法...
线程池是一种多线程处理形式,它是一种技术,用于管理执行多个任务时涉及的线程。这种技术在服务器软件中被广泛采用,因为它能够有效解决资源不足的问题,提高工作流引擎的响应速度,并显著提升系统性能。 线程池...
在Android开发中,高效地管理线程是提升应用性能的关键之一。线程池是一种机制,它允许多个任务在后台并行执行,从而避免...通过深入理解并实践这个案例,开发者可以更好地理解和掌握多线程编程,提升应用的用户体验。
总结来说,Java多线程技术包括线程的创建、线程安全的保证以及线程池的使用。熟练掌握这些知识点对于开发高效、稳定的多线程应用程序至关重要。通过合理地使用线程和线程池,我们可以有效地利用系统资源,提高程序的...
在Android开发中,多线程是必不可少的一部分,特别是在执行耗时操作如网络请求、数据库操作等时,为了不...在给定的`AndroidFutureCallableDemo`示例中,可能就是展示了如何使用这些工具来处理Android中的多线程任务。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。Java的`ExecutorService`接口和`ThreadPoolExecutor`类是实现线程池的主要工具。线程池可以有效控制运行的线程数量,...
标题"Android多线程操作"和描述"Android多线程开发实例,对使用多线程的用户有一定的参考价值!"暗示我们将深入探讨Android中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...
在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...
它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池可以有效地控制系统中的线程数量,避免了因大量创建销毁线程导致的资源浪费。 #### 二、Java实例化...
在 Java 中,多线程是并发编程的重要概念,它允许程序同时执行多个任务,从而提高系统效率...在后续的学习中,我们将进一步探讨高级多线程技术,如线程池的优化、线程同步机制的使用,以及在实际应用中的秒杀系统实现。
在Java编程中,多线程和线程池是并发处理的核心技术,对于提高程序的执行效率和资源管理具有重要作用。本文将深入探讨标题"MultiThread_并发_java_线程池_"所涵盖的知识点,以及如何在实际编程中利用这些概念。 一...
线程池的合理使用对于优化多线程程序的性能至关重要,需要根据系统的并发需求、任务性质等因素来选择合适的线程池类型和参数。同时,避免无限制地创建线程池,以免消耗过多系统资源,导致系统性能下降甚至崩溃。通过...
在安卓开发中,多线程是一项至关重要的技术,它使得应用程序能够同时执行多个任务,提升用户体验,避免主线程被阻塞导致应用无响应(ANR)。本资源包"安卓多线程大全"全面覆盖了安卓平台上的多线程实现方法,包括...