带你快速搞定java多线程(2)

网友投稿 265 2022-10-12


带你快速搞定java多线程(2)

目录1、Future的类图结构,从整体上看下Future的结构2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。3、通俗理解4、原理5、总结

1、Future的类图结构,从整体上看下Future的结构

首先看下future接口的函数,共有5个方法。

get() 获取执行的结果,另外一个重载是有时间限制的get ,如果超时会有异常

isDone() 判断future 结果是否处理完成

cancel 取消任务

2、future的使用,说的再多都么什么用,来个例子悄悄怎么用的。

package thread;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

/**

* @author 香菜

*/

public class FutureTest {

private ExecutorService bossExecutor = Executors.newSingleThreadExecutor();

public Future getHpTask(Integer input) {

return bossExecutor.submit(() -> {

System.out.println("Calculating..." + input);

Thread.sleep(1000);

return input * input;

});

}

public static void main(String[] args)zpzqCWOOm throws ExecutionException, InterruptedException {

Future calculate = new FutureTest().getHzpzqCWOOmpTask(100);

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

System.out.println("Done");

}

}

3、通俗理解

future 就像是去买手抓饼,你把钱给老板之后,老板对你说我做好了之后会放在旁边的盘子里,而这个盘子就是future,你用isDone 判断盘子里是不是有你要的手抓饼,有的话你就拿走。当然你可以一直在那等着 get(),或者去做其他的事情,等会再来拿。

4、原理

看下

public V get() throws InterruptedException, ExecutionException {

int s = state;

if (s <= COMPLETING)

s = awaitDone(false, 0L);

return report(s);

}

private int awaitDone(boolean timed, long nanos)

throws InterruptedException {

final long deadline = timed ? System.nanoTime() + nanos : 0L;

WaitNode q = null;

boolean queued = false;

for (;;) {

if (Thread.interrupted()) {

removeWaiter(q);

throw new InterruptedException();

}

int s = state;

if (s > COMPLETING) {

if (q != null)

q.thread = null;

return s;

}

else if (s == COMPLETING) // cannot time out yet

Thread.yield();

else if (q == null)

q = new WaitNode();

else if (!queued)

queued = UNSAFE.compareAndSwapObject(this, waitersOffset,

q.next = waiters, q);

else if (timed) {

nanos = deadline - System.nanoTime();

if (nanos <= 0L) {

removeWaiter(q);

return state;

}

LockSupport.parkNanos(this, nanos);

}

else

LockSupport.park(this);

}

}

看下上面的代码就是在获取结果的时候,会先判断状态是否完成,如果完成了就正常返回结果,如果没完成就会调用awaitDone,看名字也能看出来就是等待直到完成,进入代码可以看到就是将进入死循环检查状态,线程阻塞等待,直到完成。要你写你是不是也会这样写?

5、总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:TCP数据的传输过程
下一篇:OSI网络七层模型(osi网络七层模型图)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~