美文网首页java技术学习
Java多线程通过回调实现异步

Java多线程通过回调实现异步

作者: 邱风扫落叶 | 来源:发表于2019-12-12 15:20 被阅读0次

一般来说,异步与同步的区别就是,有一个线程A调用了B,直到B一直运行完结果返回给A,A才继续往下执行,但是这样有一个弊端,这样子往下执行,实在浪费资源,所以才有了异步,A调用B,然后A继续往下执行,B拿到了结果,再返回给A,A再继续处理结果,这样很明显,可以让线程不用闲着。
倘若要类比的话,可以用一个新闻举例,外国程序员20年来上班摸鱼,却代码都完成的很好而且还获得褒奖,后来高层发现不对劲,查了一下发现他把工作都交给了中国外包公司,自己中间商赚差价,其实这个过程,那位外国程序员可以是A,而中国外包公司是B,B完成工作的时候,并不妨碍A整天摸鱼。下面可以代码实现看一下

/**
 * 回调接口
 */
public interface CallBack {
    public void call(String result);
}

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 雇员线程,因为懒就不继承线程了
 */
public class EmployeeThread implements CallBack {

    public static ExecutorService service = Executors.newFixedThreadPool(1);
    public static final String name = "雇员:";
    public static boolean flag = true;

    public EmployeeThread() {

    }

    public void doWork() {
        System.out.println("上班了,打代码");
        System.out.println("交给你了,外包");
        //外包线程
        OutsourceThread outsourceThread = new OutsourceThread(this);
        Thread thread = new Thread(outsourceThread);
        //线程池执行线程
        service.execute(thread);
        //结束终止
        service.shutdown();
        //继续玩游戏
        play();
    }

    /**
     * 处理返回的数据
     * @param result
     */
    @Override
    public void call(String result) {
        System.out.println(name + result);
        System.out.println(name + "给老板");
        flag = false;
    }

    public void play() {
        while (flag) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + "打游戏");
        }
    }
}

/**
 * 外包线程
 */
public class OutsourceThread implements Runnable {

    CallBack callBack;
    public static final String name = "外包:";

    public OutsourceThread(CallBack callBack) {
        this.callBack = callBack;
    }

    @Override
    public void run() {
        try {
            System.out.println(name + "我来解决问题,coding.....");
            //睡眠5秒当做处理事件
            Thread.sleep(5000);
            System.out.println(name + "搞定了,给雇员");
            //解决了返回给雇员线程
            callBack.call("解决了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
public class Main {


    public static void main(String[] args) {
        EmployeeThread employeeThread = new EmployeeThread();
        employeeThread.doWork();
    }
}

运行结果如下


image.png

相关文章

  • Java 异步编程 持续更新ing

    多线程 异步 回调 java.util.concurrent

  • Java多线程通过回调实现异步

    一般来说,异步与同步的区别就是,有一个线程A调用了B,直到B一直运行完结果返回给A,A才继续往下执行,但是这样有一...

  • RxJava1中线程调度分析

    Java开发过程中都会碰到异步任务,通常通过回调的方式来实现。但是业务一旦复杂,会使回调的书写很麻烦。(所谓回调地...

  • java中的回调

    在java中回调分为异步回调和同步回调

  • 使用guava实现异步回调的简单demo

    使用guava实现异步回调 guava介绍 guava是google针对java异步调用任务的加强框架,它与Jav...

  • 异步的实现

    异步的三种实现方式: 回调函数事件Promise 回调函数 回调函数不一定是异步 但是异步一定是回调函数。 事件 ...

  • 07_Node.js Event

    一、回调函数 callback 1、回调函数 Node.js 异步编程的直接体现就是回调,异步编程依托于回调来实现...

  • JavaScript 控制异步走向的几种方式

    使用 setTimeout 实现异步,通过函数执行顺序、回调函数、promise 对象、async 和 await...

  • nodeJS回调函数

    NodeJS异步编程的直接体现就是回调函数。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函...

  • Node.js 回调函数

    Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。 回调...

网友评论

    本文标题:Java多线程通过回调实现异步

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