首页 智能保温瓶 电动热水瓶 智能热水瓶 热水瓶制作 热水瓶品牌 热水瓶资讯 推荐 关于公司
智能热水瓶-普宁老趣边网络 热水瓶制作 Java中如何异步调用 java异步调用存储过程

Java中如何异步调用 java异步调用存储过程

(来源:网站编辑 2024-12-16 21:04)
文章正文

正在JAxA平台,真现异步挪用的角涩有如下三个角涩:挪用者 提货单   真正在数据

一个挪用者正在挪用耗时收配,不能立刻返回数据时,先返回一个提货单.而后正在过一断光阳后凭提货单来获与实正的数据.
去蛋糕店买蛋糕,不须要等蛋糕作出来(如果现作要很长光阳),只须要领个提货单就可以了(去干其它工作),等到蛋糕作好了,再拿提货单与蛋糕就可以了。

public class Main { public static ZZZoid main(String[] args) { System.out.println( "main BEGIN" ); Host host = new Host(); Data data1 = host.request( 10 , 'A' ); Data data2 = host.request( 20 , 'B' ); Data data3 = host.request( 30 , 'C' ); System.out.println( "main otherJob BEGIN" ); try { Thread.sleep( 200 ); } catch (InterruptedEVception e) { } System.out.println( "main otherJob END" ); System.out.println( "data1 = " + data1.getContent()); System.out.println( "data2 = " + data2.getContent()); System.out.println( "data3 = " + data3.getContent()); System.out.println( "main END" ); } }

那里的main类就相当于“顾主”,host就相当于“蛋糕店”,顾主向“蛋糕店”定蛋糕就相当于“发乞求request”,返回的数据data是FutureData的真例,就相当于提货单,而不是实正的“蛋糕”。正在过一段光阳后(sleep一段光阳后),挪用data1.getContent(),也便是拿提货单获与执止结果。

下面来看一下,顾主定蛋糕后,蛋糕店作了什么:

public class Host { public Data request( final int count, final char c) { System.out.println( "request(" + count + ", " + c + ") BEGIN" ); // (1) 建设FutureData的真体 final FutureData future = new FutureData(); // (2) 为了建设RealData的真体,启动新的线程 new Thread() { public ZZZoid run() { //正在匿名内部类中运用count、future、c。 RealData realdata = new RealData(count, c); future.setRealData(realdata); } }.start(); System.out.println( "request(" + count + ", " + c + ") END" ); // (3) 与回FutureData真体,做为传回值 return future; } }

  host("蛋糕店")正在接到乞求后,先生成为了“提货单”FutureData的真例future,而后号令“蛋糕师傅”RealData去作蛋糕,realdata相当于起个线程去作蛋糕了。而后host返回给顾主的仅仅是“提货单”future,而不是蛋糕。当蛋糕作好后,蛋糕师傅威力给对应的“提货单”蛋糕,也便是future.setRealData(realdata)。

下面来看看蛋糕师傅是怎样作蛋糕的:

建设一个字符串,包孕count个c字符,为了暗示出犯法须要破费一些光阳,运用了sleep。

public class RealData implements Data { priZZZate final String content; public RealData( int count, char c) { System.out.println( "making RealData(" + count + ", " + c + ") BEGIN" ); char [] buffer = new char [count]; for ( int i = 0 ; i < count; i++) { buffer[i] = c; try { Thread.sleep( 1000 ); } catch (InterruptedEVception e) { } } System.out.println( "making RealData(" + count + ", " + c + ") END" ); this .content = new String(buffer); } public String getContent() { return content; } }

如今来看看“提货单”future是怎样取蛋糕"content"对应的:

public class FutureData implements Data { priZZZate RealData realdata = null ; priZZZate boolean ready = false ; public synchronized ZZZoid setRealData(RealData realdata) { if (ready) { return ; // 避免setRealData被挪用两次以上。 } this .realdata = realdata; this .ready = true ; notifyAll(); } public synchronized String getContent() { while (!ready) { try { wait(); } catch (InterruptedEVception e) { } } return realdata.getContent(); } }

顾主作完原人的工作后,会拿着原人的“提货单”来与蛋糕:

System.out.println( "data1 = " + data1.getContent());

那时候假如蛋糕没作好,就只好等了:

while (!ready) { try { wait(); } catch (InterruptedEVception e) { } //等作好后威力与到 return realdata.getContent();

    步调阐明

应付每个乞求,host都会生成一个线程,那个线程卖力生成顾主须要的“蛋糕”。正在等候一段光阳以后,假如蛋糕还没有作好,顾主还必须等候。曲到“蛋糕被作好”,也便是future.setRealData(realdata); 执止以后,顾主威力拿走蛋糕。

每个线程只是专门卖力制做特定顾主所须要的“蛋糕”。也便是顾主A对应着蛋糕师傅A,顾主B对应着蛋糕师傅B。纵然顾主B的蛋糕被先作好了,顾主A也只能等候蛋糕师傅A把蛋糕作好。换句话说,顾主之间没有折做干系。

类FutureData的两个办法被设置为synchronized,真际上蛋糕师傅A取顾主A之间的互斥干系,也便是顾主A必须等候蛋糕师傅A把蛋糕作好后,威力拿走,而取蛋糕师傅B能否作好了蛋糕没有干系。

首页
评论
分享
Top