使用callable java什么时候需要阻塞

Callable、Future&& 简单应用&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 在Java5之前,线程是没有返回值的,常常为了&有&返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。现在Java终于有可返回值的任务(也可以叫做线程)了。可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。Code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建两个有返回值的任务
Callable c1 = new MyCallable("A");
Callable c2 = new MyCallable("B");
//执行任务并获取Future对象
Future f1 = pool.submit(c1);
Future f2 = pool.submit(c2);
//从Future对象上获取任务的返回值,并输出到控制台
System.out.println("&&&"+f1.get().toString());
System.out.println("&&&"+f2.get().toString());
//关闭线程池
pool.shutdown();
} } class MyCallable implements Callable{
MyCallable(String oid) {
this.oid =
public Object call() throws Exception {
return oid+"任务返回的内容";
} }&&&A任务返回的内容 &&&B任务返回的内容阻塞队列&& 简单应用&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。有了这样的功能,就为多线程的排队等候的模型实现开辟了便捷通道,非常有用。Code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public class Test {
public static void main(String[] args) throws InterruptedException {
BlockingQueue bqueue = new ArrayBlockingQueue(20);
for (int i = 0; i & 30; i++) {
//将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。
bqueue.put(i);
System.out.println("向阻塞队列中添加了元素:" + i);
System.out.println("程序到此运行结束,即将退出----");
} }向阻塞队列中添加了元素:0 向阻塞队列中添加了元素:1 向阻塞队列中添加了元素:2 向阻塞队列中添加了元素:3 向阻塞队列中添加了元素:4 向阻塞队列中添加了元素:5 向阻塞队列中添加了元素:6 向阻塞队列中添加了元素:7 向阻塞队列中添加了元素:8 向阻塞队列中添加了元素:9 向阻塞队列中添加了元素:10 向阻塞队列中添加了元素:11 向阻塞队列中添加了元素:12 向阻塞队列中添加了元素:13 向阻塞队列中添加了元素:14 向阻塞队列中添加了元素:15 向阻塞队列中添加了元素:16 向阻塞队列中添加了元素:17 向阻塞队列中添加了元素:18 向阻塞队列中添加了元素:19可以看出,输出到元素19时候,就一直处于等待状态,因为队列满了,程序阻塞了。阻塞栈&&&& 简单应用&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 对于阻塞栈,与阻塞队列相似。不同点在于栈是&后入先出&的结构,每次操作的是栈顶,而队列是&先进先出&的结构,每次操作的是队列头。Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque。Code&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public class Test {
public static void main(String[] args) throws InterruptedException {
BlockingDeque bDeque = new LinkedBlockingDeque(20);
for (int i = 0; i & 30; i++) {
//将指定元素添加到此阻塞栈中,如果没有可用空间,将一直等待(如果有必要)。
bDeque.putFirst(i);
System.out.println("向阻塞栈中添加了元素:" + i);
System.out.println("程序到此运行结束,即将退出----");
} }向阻塞栈中添加了元素:0 向阻塞栈中添加了元素:1 向阻塞栈中添加了元素:2 向阻塞栈中添加了元素:3 向阻塞栈中添加了元素:4 向阻塞栈中添加了元素:5 向阻塞栈中添加了元素:6 向阻塞栈中添加了元素:7 向阻塞栈中添加了元素:8 向阻塞栈中添加了元素:9 向阻塞栈中添加了元素:10 向阻塞栈中添加了元素:11 向阻塞栈中添加了元素:12 向阻塞栈中添加了元素:13 向阻塞栈中添加了元素:14 向阻塞栈中添加了元素:15 向阻塞栈中添加了元素:16 向阻塞栈中添加了元素:17 向阻塞栈中添加了元素:18 向阻塞栈中添加了元素:19从上面结果可以看到,程序并没结束,二是阻塞住了,原因是栈已经满了,后面追加元素的操作都被阻塞了。我是天王盖地虎的分割线&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
、 、 、 、 、下次自动登录
现在的位置:
& 综合 & 正文
以Android环境为例的多线程学习笔记(四)———-Callable与Future
在JAVA的多线程机制中,Runnable接口可以用来封装一个异步运行的任务,但是它相当于是一个没有参数类型和返回
值的异步方法,所以在JAVA中就又出现了callable机制,callable是一个参数化的类型接口,里面只有一个call方法,但是该方法是
有返回值的,而且返回值类型就是参数类型。与callable接口相配套使用的就是Future接口,其作用就是用来保存异步运算的结果和
和启动一个异步运算,Future接口中一共有五个方法,分别用来查询和控制线程运行的状态和结构。
Future接口中的方法列表:
public interface Future&V&
V get() throws ....;//用来返回运算的最后结果,如果计算还未完成,则会被阻塞
*如果计算完成,则返回true
*如果计算完成之前,调用这个方法超时,则会发生TimeoutException异常。
*如果运行时线程被中断则会发生InterruptedException中断异常
*否则被阻塞
V get(long timeout,TimeUnit unit) throws...;
* 取消运算,mayInterrupt为true时中断线程,但此时如果线程已经被阻塞或者休眠则会发生InterruptedException中断异常
void cancle(boolean mayInterrupt);
boolean isCancleed();//判断线程是否被取消
boolean isDone();//判断计算是否已经完成
但是在实际的运用中间我们还有更简洁的机制那就是FutureTask包装器,它可将Callable转换成Future和Runnable,它同时是实现了两者的接口的。
具体的使用方法如下面的:
* 定义一个任务类,实现Callable接口
public static class MyCallableClass implements Callable&String&{
private int value = 0;
public MyCallableClass(int flag){
this.value =
public String call() throws Exception{
if (this.value == 0){
// 如果value的值为0,则立即返回
return "value = 0";
// value不为0,则抛出异常
throw new Exception("Invalid value!");
//开启线程
case R.id.button3:
MyCallableClass task1 = new MyCallableClass(0);
FutureTask&String& Futask = new FutureTask&String&(task1);
Thread t = new Thread(Futask);
t.start();
System.out.println("task1: " + Futask.get());
catch(Exception e)
System.out.println(e.toString());
线程结束后,最后的结果将会输出“alue=0”。这样也就简单的实现了将一个线程里运算结果最后返回的效果,其实这个功能说更简单一点也就是利用Future
的特性实现了在主线程和子线程的通信问题,在主线程中可以得到子线程的最后结果,和控制、判断子线程的运行状态,不过这种通信效果仅仅只是单向的,并不完美。
如果要实现线程间的完美通信,那就要用到一个更复杂的线程间的通信机制了,嗯,等下几次再详细的写这个线程通信问题吧。
&&&&推荐文章:
【上篇】【下篇】4261人阅读
Java基础(5)
Runnable是执行工作的独立任务,但是它不返回任何值。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表的是从方法call()中返回的值,并且必须使用ExecutorServices.submit()方法调用它,下面是一个简单示例。
package com.
import java.util.ArrayL
import java.util.L
import java.util.concurrent.C
import java.util.concurrent.ExecutionE
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import java.util.concurrent.F
public class CallableTest {
public static void main(String[] args) {
ExecutorService exec=Executors.newCachedThreadPool();
List&Future&String&& results=new ArrayList&Future&String&&();
for(int i=0;i&5;i++) {
results.add(exec.submit(new TaskWithResult(i)));
for(Future&String& fs :results) {
System.out.println(fs.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
class TaskWithResult implements Callable&String& {
public TaskWithResult(int id) {
public String call() throws Exception {
return &result of TaskWithResult &+
}实验结果:
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
submit()方法回产生Future对象,它用Callable返回结果的特定类型进行了参数化。可以用isDone()方法来查询Future是否已经完成,当任务完成时,它具有一个结果,可以调用get()方法获取该结果。也可以不用isDone()进行检查就直接调用get(),在这种情况下,get()将阻塞,直至结果准备就绪。还可以在试图调用get()来获取结果之前,先调用具有超时的get(),或者调用isDone()来查看任务是否完成。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:128171次
积分:2151
积分:2151
排名:第12602名
原创:79篇
评论:48条
文章:17篇
阅读:32640
(2)(46)(2)(2)(7)(5)(13)(7)(1)(3)JAVA线程相关(19)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3592061次
积分:28018
积分:28018
排名:第132名
原创:217篇
转载:376篇
译文:178篇
评论:338条
(1)(5)(53)(31)(60)(2)(8)(2)(6)(1)(2)(1)(7)(3)(7)(7)(7)(8)(7)(21)(45)(7)(8)(33)(17)(248)(97)(88)(1)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&}

我要回帖

更多关于 java阻塞队列使用场景 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信