一般来说,异步与同步的区别就是,有一个线程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
网友评论