java cas 非线程安全_FutureTask CAS确保线程安全

FutureTask在我看来最主要的功能就是让线程有了返回值,Runnable和Thread都是无返回值的线程。

那么怎么会有返回值呢,这主要依靠它的几个状态以及参数outcome

private volatile int state; 线程状态

private static final int NEW = 0;未运行 起始态

private static final int COMPLETING = 1;运行完成但是outcome还未赋值,中间状态

private static final int NORMAL = 2;正常完成,outcome已赋值 最终态

private static final int EXCEPTIONAL = 3;异常完成,outcome存的是异常值 最终态

private static final int CANCELLED = 4;已取消 最终态

private static final int INTERRUPTING = 5;中断中,中间状态

private static final int INTERRUPTED = 6;中断,最终态

outcome主要就是用来存返回值

private Object outcome; // non-volatile, protected by state reads/writes

获取返回值用get方法,此方法在线程没有运行完时会阻塞等待。

37aa91fd275d58b981db52151de23e30.png

具体使用:

1.

ExecutorService executorService = Executors.newCachedThreadPool();

Future submit = executorService.submit(() -> {

Thread.sleep(500);

return 1;

});

Object o = submit.get();

if (o instanceof Integer) {

int a = (Integer) o;

System.out.println(a);

}

2.

Future> submit1 = executorService.submit(new Thread(() -> System.out.println("11")));

System.out.println(submit1);

executorService.shutdown();

3.

FutureTask stringFutureTask = new FutureTask<>(new CallableTask());

Thread thread = new Thread(stringFutureTask);

thread.setName("task----xxxx");

thread.start();

if (!stringFutureTask.isDone()) {

Thread.sleep(3000);

}

System.out.println(stringFutureTask.get());

static class CallableTask implements Callable {

@Override

public String call() throws Exception {

Thread.sleep(5000);

System.out.println("got it");

return "xxxx";

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值