Callable、Future&阻塞队列&阻塞栈

Callable、Future   简单应用                                                         

在Java5以前,线程是没有返回值的,经常为了“有”返回值,破费周折,并且代码很很差写。或者干脆绕过这道坎,走别的路了。如今Java终于有可返回值的任务(也能够叫作线程)了。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{ 
        private String oid; 

        MyCallable(String oid) { 
                this.oid = oid; 
        } 

        @Override 
        public Object call() throws Exception { 
                return oid+"任务返回的内容"; 
        } 
}
>>>A任务返回的内容 
>>>B任务返回的内容

阻塞队列   简单应用                                                                 

阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,若是队列满了,添加新元素的操做会被阻塞等待,直到有空位为止。一样,当队列为空时候,请求队列元素的操做一样会阻塞等待,直到有可用元素为止。ide

有了这样的功能,就为多线程的排队等候的模型实现开辟了便捷通道,很是有用。this

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时候,就一直处于等待状态,由于队列满了,程序阻塞了。spa

阻塞栈     简单应用                                                                  

对于阻塞栈,与阻塞队列类似。不一样点在于栈是“后入先出”的结构,每次操做的是栈顶,而队列是“先进先出”的结构,每次操做的是队列头。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

从上面结果能够看到,程序并没结束,二是阻塞住了,缘由是栈已经满了,后面追加元素的操做都被阻塞了。code

我是天王盖地虎的分割线                                                             

相关文章
相关标签/搜索