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


    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{ 
            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,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。

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

    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

    从上面结果可以看到,程序并没结束,二是阻塞住了,原因是栈已经满了,后面追加元素的操作都被阻塞了。

    我是天王盖地虎的分割线                                                             

  • 相关阅读:
    洛谷P2402 奶牛隐藏
    BZOJ2150: 部落战争
    HDU 6405 Make ZYB Happy(广义SAM)
    CodeForces
    2019CCPC秦皇岛 E题 Escape(网络流)
    2019CCPC秦皇岛D题 Decimal
    2019CCPC秦皇岛I题 Invoker(DP)
    2019CCPC秦皇岛 F Forest Program
    2019CCPC秦皇岛 J MUV LUV EXTRA(KMP)
    2019CCPC秦皇岛 K MUV LUV UNLIMITED(博弈)
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4104014.html
Copyright © 2020-2023  润新知