首页 >> 农业机械

互联网面试-请简单介绍高并发场景中的Future程式设计?

农业机械 2024-01-20 12:18:28

lking 步骤学 if (isDone){ return; } // 量度进行时,为result指定结果,并且将isDone设置为true,同时唤起马上当中的内存 this.result = result; this.isDone = true; LOCK.notifyAll(); } } @Override public boolean done() { return isDone; }}

在FutureTask当中可用了内存间的通信wait和notifyAll,当使命未进行时以前通过get步骤给予模块,绑定方亦会进入到漏出稳定状态,直到使命进行时此后收到内存引导,finish步骤转交到使命进行时的知会,然后引导因为绑定了get步骤而进入漏出的内存。

FutureService借助于

public class FutureServiceImpl implements FutureService { private final static String FUTURE_THREAD_PREFIX = "FUTURE-"; private final AtomicInteger nextCounter = new AtomicInteger(0); private String getNextName(){ return FUTURE_THREAD_PREFIX+nextCounter.getAndIncrement(); } @Override public Future submit(Runnable runnable) { final FutureTask future = new FutureTask<>(); new Thread(()->{ runnable.run(); // 使命制订当中止此后将null作为模板离开 future.finish(null); },getNextName()).start(); return future; } @Override public Future submit(Task task, IN input) { final FutureTask future = new FutureTask<>(); new Thread(()->{ OUT result = task.get(input); // 使命制订当中止此后,将相符的结果通过finish的方式将传导给future future.finish(result); },getNextName()).start(); return future; }}Future步骤学检测

这里我们送交一个未离开值的使命,代码如下,

public class FutureTest { public static void main(String[] args) throws InterruptedException { FutureService service = FutureService.newServcie(); Future future = service.submit(()->{ try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("使命进行时!"); }); future.get(); }}

送交一个有离开值的使命

public class FutureTest { public static void main(String[] args) throws InterruptedException { FutureService service = FutureService.newServcie(); Future future = service.submit(input->{ try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return input.length(); },"Hello"); System.out.println(future.get()); }}升级给予结果的步骤

从上面两个检测的离开结果来看,如果我们绑定了future的get步骤,那么我们的机制就亦会进入到漏出的稳定状态,这个操控与我们的预期不毕竟相符合,这个也是整个的Future种系统长期存有的缺陷。那么我们如何去改进这个给予get步骤马上的缺陷呢?这就引入了一个Callback的动态。代码如下

@Override public Future submit(Task task, IN input, Callback callback) { final FutureTask future = new FutureTask<>(); new Thread(()->{ OUT result = task.get(input); // 使命制订当中止此后,将相符的结果通过finish的方式将传导给future future.finish(result); if (null!=callback){ callback.call(result); } },getNextName()).start(); return future; }

检测功效,亦会发现我们代课可以不可用get步骤就可以进行时制订结果的给予。

public class FutureTest { public static void main(String[] args) throws InterruptedException { FutureService service = FutureService.newServcie(); service.submit(input->{ try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return input.length(); },"Hello",System.out::println); }}总结

在以前的分享当中很多的之外我们都提到了Future步骤学,通过这篇文章我们也必要性的了解了关于Future步骤学的马克思主义。其总括就是三维了一个认桥段,通过这种方式将来借助于对CPU的高效利用。当然这里我们假定的只是一个基础性演示发行版,其当中的存有的缺陷还有很多,个人兴趣的读者可以自己思维之外段落的优化。

广州试管婴儿费用多少
尿路感染
注射用胸腺法新
积大本特盐酸坦洛新缓释片
江中多维元素片
相关阅读
友情链接