Java 基础之CallBack的使用

来源:互联网 发布:姓名贴软件 编辑:程序博客网 时间:2024/06/06 05:09

在很多情况我们都会希望这样一个过 程,在我们执行某个任务之后,我们都能得到一个返回值,便于我们任务后的处理;比如线程,我们new thread,自然希望得到thread执行后的结果并做一些处理。

  • 我们实现线程两个,一个extends Thread(); 另一个implements
    Runnable(),但这两个方法都有一个致命的缺陷就是取不到返回值;通常我们是通过使用共享变量(static变量)
    线程见的通信来实现的如android handler 广播(Broadcast);
  • fulturetask 用来执行java超时操作 这是可以去做其他事情,过一段时间回来取得执行结果
/** * Created by jiangph on 16-1-10. */public class fultureTaskDemo {    /***     * 我们传统上实现线程的两个方法,一个是继承Thread类;另一个是实现runnable接口     * 但是这两个方法都有致命的:就是取不到返回值;通常我们是通过使用共享变量(static变量)  线程见的通信来实现的如android handler 广播(Broadcast)     * fulturetask 用来执行java超时操作  这是可以去做其他事情,过一段时间回来取得执行结果     */    /***     * fulture主要是来执行耗时的操作,同步下的异步操作     *     */    public static void main(String[]args)    {        fultureTaskDemo fulturedemo=new fultureTaskDemo();        //初始化一个callable对象和fulturetask对象        Callable pAccount=fulturedemo.new PrivateAccount();        FutureTask futureTask=new FutureTask(pAccount);        //使用fulturetask创建一个线程        Thread pAccountThread=new Thread(futureTask);        System.out.println("fulturetask线程现在开始启动,启动时间为:"+System.nanoTime());        pAccountThread.start();        System.out.println("主线成开始执行其他人物");        //从其他账户获取总及呢        int totalMoney=new Random().nextInt(100000);        System.out.println("现在你在其他账户中的总金额为" + totalMoney);        System.out.println("等待私有账户总金额统计完毕...");        while (!futureTask.isDone()){            try {                Thread.sleep(500);                System.out.println("私有账户计算为完成继续等待...");            }            catch (InterruptedException e)            {                e.printStackTrace();            }        }        System.out.println("futureTask线程计算完毕,此时时间为" + System.nanoTime());        Integer privateAccountMoney=null;        try{            privateAccountMoney=(Integer)futureTask.get();        }catch (InterruptedException e)        {            e.printStackTrace();        }catch (ExecutionException e) {            e.printStackTrace();        }        System.out.println("您现在的总金额为:" + totalMoney + privateAccountMoney.intValue());    }    @SuppressWarnings("all")    class PrivateAccount implements Callable{        Integer totalMoney;        @Override        public Object call() throws Exception        {            Thread.sleep(5000);            totalMoney=new Integer(new Random().nextInt(10000));            System.out.println("您当前有" + totalMoney + "在您的私有账户中");            return totalMoney;        }    }}

当然我们也可以试着自己写一个callBack,通过匿名类,接口来实现

package CallBack;/** * Created by jiangph on 16-1-18. */public class TestCallBack {    public static void main(String[]args)    {        new TestCallBackDao().useCallBack(new CallBackInterface() {            @Override            public void onCallBack() {                System.out.println("1");            }        });    }}//定义一个业务处理类class TestCallBackDao{    public  void useCallBack(CallBackInterface callBackInterface)    {        //调用接口方法        callBackInterface.onCallBack();    }}interface CallBackInterface{    public void onCallBack();}
2 0