0 0

callable Future 如何根据返回值 实现 中断所有线程。5

需求:所有线程放入线程池中,只要有一个线程的发挥值为false,立即停止所有线程的运行,以及关闭线程池。 代码如下:

public static boolean test0() {
		final ThreadPoolExecutor exec = (ThreadPoolExecutor) Executors
				.newFixedThreadPool(5);
		CompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(
				exec);
		Callable<Boolean> call;
		Future<Boolean> task;
		int threadNum = 50;
		int successfulThreadNum = 0;
		for (int i = 0; i < 50; i++) {
			final int temp = i;
			call = new Callable<Boolean>() {
				public Boolean call() throws Exception {
					Thread.sleep(1000000 * (int) Math.random());
					System.out.println("Call" + temp);
					//return (temp / 3 >=1 ? Boolean.FALSE : Boolean.TRUE);  
					return true;
				}
			};
			cs.submit(call);
		}
		while (true) {
			try {
				Boolean obj = cs.take().get();
				System.out.println(obj);
				if (!obj) {
					exec.shutdownNow();
					System.out.println("shut down now;");
					return true;
				}
				if (obj) {
					successfulThreadNum++;
				}
				if (successfulThreadNum >= 30) {
					exec.shutdown();
					return true;
				}
					
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
请大神指出缺陷或者错误之处。。。。。

 

2014年5月17日 14:42

1个答案 按时间排序 按投票排序

0 0

楼主你好,目前从代的代码看好像没什么问题,不过你内部逻辑全部是返回true的。呵呵。我这里有一种不使用CompleteService的写法,可以参考。

	public static boolean anotherTest() {
		final ThreadPoolExecutor exec = (ThreadPoolExecutor) Executors
				.newFixedThreadPool(2);
		List<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>();

		for (int i = 0; i < 5; i++) {
			final int temp = i;
			TaskObj t = new TaskObj(temp);
			tasks.add(t);
		}
		try {
			List<Future<Boolean>> results = exec.invokeAll(tasks);
			
			for(Future<Boolean> f : results) {
				boolean result = f.get();
				if(!result) {
					exec.shutdownNow();
					System.out.println("shut down now;");
					return false;
				}
			}
			exec.shutdown();
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		return true;
	}
class TaskObj implements Callable<Boolean> {
	final int flag;

	public TaskObj(int flag) {
		this.flag = flag;
	}

	final Random rand = new Random();// 随机数可以用这个生成

	@Override
	public Boolean call() throws Exception {
		int r = rand.nextInt(3) + 1;
		Thread.sleep(1000 * r);
		System.out.println("Call" + flag);
		// return (temp / 3 >=1 ? Boolean.FALSE : Boolean.TRUE);
		return true;
	}

}

其中随机数生成可以使用
Random rand = new Random();
之后rand.nextInt(5);就可以生成0-5之间的数。

希望可以帮到你。

2014年5月18日 15:22

相关推荐

    Java使用Callable和Future创建线程操作示例

    1. 创建Callable接口的实现类,并实现call()方法,该call()方法将作为该线程的执行体,且该call()方法有返回值,再创建Callable的实例。从Java 8开始,可以直接使用Lamda表达式创建Callable对象。 2. 使用...

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    有返回值的线程

    除了`Callable`和`Future`,还可以使用`Runnable`配合`ExecutorService`和`Future`来实现有返回值的线程。首先创建一个实现了`Runnable`的类,然后在内部创建一个`Future`对象,通过`ExecutorService`提交任务并获取...

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

    总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...

    Java中的Runnable,Callable,Future,FutureTask的比较

    Java中的Runnable、Callable、Future和FutureTask是Java多线程编程中的核心概念,它们各自扮演着不同的角色,共同协作以实现并发任务的管理和执行。 1. **Runnable**: Runnable是最基本的多线程接口,它只有一个`...

    Java多线程Callable和Future接口区别

    Java多线程Callable和Future接口的使用场景非常广泛,如计算复杂的数学问题、处理大规模数据、实现高性能的服务器等等。在这些场景中,我们可以使用Callable和Future接口来实现异步计算,从而提高系统的性能和可扩展...

    java callable(多线程)

    在这个例子中,我们定义了一个`MyCallableClass`类实现`Callable`接口,并根据`flag`的值返回不同的结果或抛出异常。主函数中,我们创建了一个固定大小的线程池,然后提交了三个`Callable`任务,并通过`Future`对象...

    详解Java Callable接口实现多线程的方式

    Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取执行结果。 一、Callable接口简介 Callable接口是一个泛型接口,用于表示可以调用并返回结果的代码。它提供了一个call()方法,该方法...

    Java并发编程Callable与Future的应用实例代码

    我们使用Callable与Future来实现异步编程,将原本需要21次数据库访问的接口改造成10个线程并发访问数据库,极大地缩短了响应时间。 结论 Callable与Future是Java并发编程中两个非常重要的概念,它们通常结合使用来...

    java并发包之Callable和Future

    `Callable`和`Future`的组合是Java并发包中一个强大的工具,它弥补了`Runnable`接口的不足,使得异步编程可以获取到返回值并处理异常。同时,`ExecutorService`作为线程池的实现,为并发编程提供了一种优雅的解决...

    详解JDK中ExecutorService与Callable和Future对线程的支持

    Java并发编程中,ExecutorService、Callable和Future是三大核心组件,它们之间紧密相连,共同实现了高效、安全的并发编程。下面我们将详细介绍这些组件的作用和实现原理。 ExecutorService ------------- ...

    Callable:Callable与Future在Web应用中的优化案例

    1. **任务调度**:在高并发环境下,通过Callable和Future可以实现任务的异步处理,比如在Servlet容器中,可以创建一个线程池,将耗时的操作提交到线程池,然后返回Future对象给客户端,客户端可以依据Future检查任务...

    JAVA中Callable的使用

    总结,Java中的Callable接口提供了比Runnable更强大的功能,允许我们在线程中执行有返回值的任务。通过结合ExecutorService和Future,我们可以方便地管理这些任务的执行,获取结果并处理可能出现的异常。熟练掌握...

    【Java】Callable创建线程用到的适配器模式(csdn)————程序.pdf

    在Java编程中,多线程是并发处理任务的关键机制,Callable接口和FutureTask类是Java提供的用于创建具有返回值的线程的重要工具。本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在...

    并发编程——认识java里的线程(csdn)————程序.pdf

    然后,创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable 对象,该 Future Task 对象封装了 Callable 对象的 call() 方法的返回值。最后,使用 Future Task 对象作为 Thread 对象的 target 创建线程...

    Java多线程之Callable接口的实现

    FutureTask类同时实现了Future和Runnable接口,因此它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。例如: Callable&lt;Integer&gt; mycallabletask = new MyCallableTask(); FutureTask...

    四种方式实现线程

    本文将深入探讨四种实现线程的方法:Thread类、Runnable接口、Callable接口以及ExecutorService。每种方法都有其特定的应用场景和优势,下面我们将逐一详细讲解。 1. **Thread类** 当直接继承`java.lang.Thread`类...

    Java多线程之异步Future机制的原理和实现共5页.p

    异步Future机制是Java多线程中用于提升效率和优化资源利用的一种设计模式,它允许我们在主线程中不等待子线程的执行结果,而是通过Future对象来获取子线程的计算结果。这种方式极大地提高了程序的响应速度,尤其是在...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    Java多线程实现Callable接口

    2. **Future接口**:`Future, Object&gt;&gt;&gt; future` 是一个Future对象,它是用于获取Callable线程执行结果的接口。`future.get()` 方法会阻塞,直到计算完成并返回结果。 3. **ExecutorService**:`ExecutorService ...

Global site tag (gtag.js) - Google Analytics