java技术学习

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

2019-12-12  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读