美文网首页
Java异步编程 1

Java异步编程 1

作者: 巴巴11 | 来源:发表于2020-05-11 23:49 被阅读0次

异步,相比同步执行来说。

早期的异步,可以通过多线程来完成。

例子1

package async;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 早期的异步
 * CountDownLatch实现
 */
public class Main1 {
    final static CountDownLatch latch = new CountDownLatch(2);
    public static void main(String[] args) throws InterruptedException {

        // 同步方法执行
//        syncFunc1();
//        syncFunc2();

        // 异步执行方法
        asyncFunc1();
        asyncFunc2();

        latch.await();
        TimeUnit.SECONDS.sleep(2);
        System.out.println("main thread end...");
    }

    static void syncFunc1() throws InterruptedException {
        System.out.println("执行同步方法1 begin...");
        TimeUnit.SECONDS.sleep(1);
        System.out.println("执行同步方法1 end...");
    }

    static void syncFunc2() throws InterruptedException {
        System.out.println("执行同步方法2 begin...");
        TimeUnit.SECONDS.sleep(2);
        System.out.println("执行同步方法2 end...");
    }

    static void asyncFunc1() throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行同步方法1 begin...");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("执行同步方法1 end...");
                latch.countDown();
            }
        }).start();

    }

    static void asyncFunc2() throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行同步方法2 begin...");
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("执行同步方法2 end...");
                latch.countDown();
            }
        }).start();

    }
}


package async;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * 早期的异步
 * CyclicBarrier
 * 效果和Main1一样
 */
public class Main2 {
    final static CyclicBarrier barrier = new CyclicBarrier(2);

    public static void main(String[] args) throws InterruptedException, BrokenBarrierException {

        // 同步方法执行
//        syncFunc1();
//        syncFunc2();

        // 异步执行方法
        asyncFunc1();
        asyncFunc2();

//        barrier.await();
        TimeUnit.SECONDS.sleep(2);
        System.out.println("main thread end...");
    }

    static void syncFunc1() throws InterruptedException {
        System.out.println("执行同步方法1 begin...");
        TimeUnit.SECONDS.sleep(1);
        System.out.println("执行同步方法1 end...");
    }

    static void syncFunc2() throws InterruptedException {
        System.out.println("执行同步方法2 begin...");
        TimeUnit.SECONDS.sleep(2);
        System.out.println("执行同步方法2 end...");
    }

    static void asyncFunc1() throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行同步方法1 begin...");
                try {
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("执行同步方法1 end...");
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    static void asyncFunc2() throws InterruptedException {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行同步方法2 begin...");
                try {
                    TimeUnit.SECONDS.sleep(2);
                    System.out.println("执行同步方法2 end...");
                    barrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

package async;

import java.util.concurrent.*;

/**
 * Main1  Main2是使用多线程,通过线程之间的通信来实现异步的目的
 * 实现异步,可以通过现有的同步组件CountDownLatch,CyclicBarrier,Semaphore
 * 实现同步,则需要锁,synchronized,volatile, lock ,以及通过AQS模板实现的锁 ReentrantLock,ReentrantReadWriteLock等
 * 当然,实现异步可以使用原始Thread手段,thread.join, thread.notify/notifyAll, Thread.sleep, thread.await
 *
 * 异步,等待返回值
 * 这里有个弊端,等待,而且是阻塞的等待
 * 但是如果异步的结果不是后续步骤需要的话,也能接受
 *
 */
public class Main3 {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        System.out.println("process begin ...");
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Future<String> future = pool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("step1 begin...");
                TimeUnit.SECONDS.sleep(2);
                return "step1 finished...";
            }
        });
        System.out.println("do something1 ....");
        TimeUnit.SECONDS.sleep(1);
        System.out.println("do something2 ....");
        System.out.println(future.isDone());
        System.out.println(future.get());
        System.out.println("main thread done...");
        pool.shutdown();
    }
}


/**
 * 如果异步的结果,是后续步骤需要的
 * 那么使用CompletableFuture
 *
 * CompletableFuture工具类扩展了Future接口功能,提供了异步回调式的能力
 *
 * supplyAsync(function) 异步执行方法
 * thenAccept(function) 指定异步回调方法
 */

相关文章

  • 读书笔记#Java异步编程实战-上

    Java异步编程实战 chap1 认识异步编程 异步编程概念与作用在使用同步编程方式时,由于每个线程同时只能发起一...

  • 一篇看完JS异步编程的进阶史

    一、Javascript实现异步编程的过程以及原理 1、为什么要用Javascript异步编程 众所周知,Java...

  • 认识异步编程

    认识异步编程 本章主要介绍异步编程的概念和作用,Java中异步编程的场景以及不同异步编程场景应使用什么技术实现。 ...

  • Java异步编程 1

    异步,相比同步执行来说。 早期的异步,可以通过多线程来完成。 例子1

  • 淘宝资深java技术专家爆肝整理分享java异步编程实战文档

    前言 本文由淘宝资深java技术专家爆肝整理分享的java异步编程实战文档,针对常见异步编程场景,从编程语言、开发...

  • Java 异步编程(上)

    这个世界就是异步的,因此异步编程变得越来越重要。当然 Java 语言也对异步编程提供良好支持。特别是在 Java ...

  • CompletableFuture使用详解

    什么是 CompletableFuture? CompletableFuture 用于 Java 中的异步编程。异...

  • java 异步编程

    前言 在 java 中你不了解异步编程,crud 完全没有问题,但是有的需求你无法优雅的实现。 js 也存在异步编...

  • Java8——异步编程

    Java8——异步编程 异步编程 所谓异步其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法 创建任...

  • 2018-05-24-多线程学习

    java多线程并发的编程学习 1,概念的学习 同步异步:同步需要等待异步不需要,同步如对共享数据操作避免脏数据...

网友评论

      本文标题:Java异步编程 1

      本文链接:https://www.haomeiwen.com/subject/bfxmnhtx.html