Java里的回调机制,你了解过吗?( 二 )

学生Tom
public class Tom implements Student{ @Override public void resolveProblem(Teacher teacher) { try { //学生思考了3秒后得到了答案,通过老师提供的回调方法告诉老师 。Thread.sleep(3000); System.out.println("work out"); teacher.tellAnswer(111); } catch (InterruptedException e) { e.printStackTrace(); } }测试类
public class Test { public static void main(String[] args) { //测试 Student tom = new Tom(); Teacher lee = new Teacher(tom); lee.askProblem(tom, lee); //结果// 等学生回答问题的时候老师玩了 1秒的手机// 等学生回答问题的时候老师玩了 2秒的手机// 等学生回答问题的时候老师玩了 3秒的手机// work out// the answer is 111 }}多线程中的“回调”
Java多线程中可以通过callable和future或futuretask结合来获取线程执行后的返回值 。实现方法是通过get方法来调用callable的call方法获取返回值 。
其实这种方法本质上不是回调,回调要求的是任务完成以后被调用者主动回调调用者的接口 。而这里是调用者主动使用get方法阻塞获取返回值 。
public class 多线程中的回调 { //这里简单地使用future和callable实现了线程执行完后 public static void main(String[] args) throws ExecutionException,InterruptedException { ExecutorService executor = Executors.newCachedThreadPool(); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { System.out.println("call"); TimeUnit.SECONDS.sleep(1); return "str"; } }); //手动阻塞调用get通过call方法获得返回值 。System.out.println(future.get()); //需要手动关闭,不然线程池的线程会继续执行 。executor.shutdown(); //使用futuretask同时作为线程执行单元和数据请求单元 。FutureTask<Integer> futureTask = new FutureTask(new Callable<Integer>() { @Override public Integer call() throws Exception { System.out.println("dasds"); return new Random().nextInt(); } }); new Thread(futureTask).start(); //阻塞获取返回值 System.out.println(futureTask.get());}@Testpublic void test () { Callable callable = new Callable() {@Override public Object call() throws Exception { return null; } }; FutureTask futureTask = new FutureTask(callable);}



推荐阅读