zoukankan      html  css  js  c++  java
  • Java多线程相关的常用接口

    Runnable 是一个接口,里面只声明了一个方法run();返回值为void所以无法拿到执行完的结果。只能通过共享变量或者线程通信来搞定。
    Future就是对具体的Runable或者Callable任务的执行结果进行取消,查询是否完成,获取结果。
    FutureTask实现了RunnableFuture接口,RunableFuture接口继承了Runable和Future接口,所以他既可以被线程执行,也可以作为Future得到Callable的返回值。
    CompletableFutures是java8中新增加的一个类,主要用来处理异步。CompletableFuture不但可以调用get()方法获取执行结果,也可以使用回调函数来得到处理结果CompletableFuture可以通过completeExceptionally 函数来发出异常通知,同时我们也可以显示声明异常处理。CompletableFuture还有许多方法,来满足不同的需求场景,具体的方法 还需要使用到的时候在来进行具体分析。

    在两个线程里并行执行任务A和任务B,只要有一个任务完成了,就执行任务C。代码如下:

    [java] view plain copy
     
    1. import java.time.LocalTime;  
    2. import java.util.Random;  
    3. import java.util.concurrent.CompletableFuture;  
    4. import java.util.concurrent.ExecutionException;  
    5. import java.util.concurrent.ExecutorService;  
    6. import java.util.concurrent.Executors;  
    7. import java.util.concurrent.Future;  
    8. import java.util.concurrent.TimeUnit;  
    9. import java.util.concurrent.TimeoutException;  
    10.   
    11. public class LearnCompleteFuture {  
    12.       
    13.     private static Random random = new Random();  
    14.   
    15.     public static void main(String[] args) throws InterruptedException, ExecutionException {  
    16.         useFuture();  
    17.           
    18.         TimeUnit.SECONDS.sleep(10);  
    19.         System.out.println();  
    20.           
    21.         useCompletableFuture();  
    22.     }  
    23.   
    24.     private static void useFuture() throws InterruptedException, ExecutionException {  
    25.         System.out.println("Future");  
    26.         ExecutorService exector = Executors.newFixedThreadPool(3);  
    27.         Future<Void> futureA = exector.submit(() -> work("A1"));  
    28.         Future<Void> futureB = exector.submit(() -> work("B1"));  
    29.         while (true) {  
    30.             try {  
    31.                 futureA.get(1, TimeUnit.SECONDS);  
    32.                 break;  
    33.             } catch (TimeoutException e) {  
    34.             }  
    35.             try {  
    36.                 futureB.get(1, TimeUnit.SECONDS);  
    37.                 break;  
    38.             } catch (TimeoutException e) {  
    39.             }  
    40.         }  
    41.         exector.submit(() -> work("C1")).get();  
    42.         exector.shutdown();  
    43.     }  
    44.       
    45.     private static void useCompletableFuture() throws InterruptedException, ExecutionException {  
    46.         System.out.println("CompletableFuture");  
    47.         CompletableFuture<Void> futureA = CompletableFuture.runAsync(() -> work("A2"));  
    48.         CompletableFuture<Void> futureB = CompletableFuture.runAsync(() -> work("B2"));  
    49.         futureA.runAfterEither(futureB, () -> work("C2")).get();  
    50.     }  
    51.   
    52.     public static Void work(String name) {  
    53.         System.out.println(name + " starts at " + LocalTime.now());  
    54.         try {  
    55.             TimeUnit.SECONDS.sleep(random.nextInt(10));  
    56.         } catch (InterruptedException e) {  
    57.         }  
    58.         System.out.println(name + " ends at " + LocalTime.now());  
    59.         return null;  
    60.     }  
    61. }  

    两种方法useFuture和useCompletableFuture相比:

    首先,方法2 比 方法1 的代码简单。在方法1里,既要自己照顾线程池的创建和销毁,还要负责对任务A和任务B的监控。而方法2,只需要用CompletableFuture的runAfterEither就完成了任务A、任务B和任务C之间的依赖关系的定义。

    在方法2,甚至用一行代码就能完成:

    [java] view plain copy
     
    1. CompletableFuture.runAsync(() -> work("A2")).runAfterEither(CompletableFuture.runAsync(() -> work("B2")), () -> work("C2")).get();  



    其次,方法2 比 方法1 高效。

    方法1的主线程,要通过while(true)的方式不断地轮询任务A和任务B的运行状况,浪费CPU资源,而方法2的主线程只需要在最后的get()上静静地等待任务C的完成。

    http://blog.csdn.net/zjysource/article/details/54409772

  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/doit8791/p/8063745.html
Copyright © 2011-2022 走看看