Java 中线程(三)

如果要用能返回值得线程,得用到Callable 和FutureTask,但是返回值是阻塞式的,因此自己实现了个异步返回值的线程。
功能简单了点,只是个思路。

package thread;

import java.text.SimpleDateFormat;
import thread.FutureJob.CallBack;

interface ReturnBackRunnable<T>{
    T run();
}


class FutureJob<T> implements Runnable{

    interface CallBack<T>{
        void callBack(T t);
    }
    private CallBack<T> mCallBack;
    private ReturnBackRunnable<T> returnBackRunnable;


    public FutureJob(ReturnBackRunnable<T> returnBackRunnable) {
        this.returnBackRunnable = returnBackRunnable;
    }


    public FutureJob(CallBack<T> mCallBack, ReturnBackRunnable<T> returnBackRunnable) {
        this.mCallBack = mCallBack;
        this.returnBackRunnable = returnBackRunnable;
    }


    public void setCallBack(CallBack<T> mCallBack) {
        this.mCallBack = mCallBack;
    }


    @Override
    public void run() {
        if(returnBackRunnable!=null){
        T value=    returnBackRunnable.run();
        if(mCallBack!=null){
            mCallBack.callBack(value);
        }
        }

    }



}

public class TCallable {

    public static void main(String[] args) {
        FutureJob<String> futureJob = new FutureJob<String>(new ReturnBackRunnable<String>() {

            @Override
            public String run() {
                try {
                    Thread.sleep(1000*10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return "OK";
            }
        });
        futureJob.setCallBack(new CallBack<String>() {

            @Override
            public void callBack(String t) {
                System.out.println("the back value is "+t);
            }
        });

        System.out.println(formatDate(System.currentTimeMillis()));
        new Thread(futureJob).start();
        System.out.println(formatDate(System.currentTimeMillis()));
    }



private static String formatDate(long date){
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    return simpleDateFormat.format(date);
}
}

执行结果:

2017/06/22 23:01:53
2017/06/22 23:01:53
the back value is OK

从结果看,执行完start后,返回main继续执行,结果是异步返回的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值