一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java多線程實現異步調用的方法

Java多線程實現異步調用的方法

2020-01-07 14:09mrr JAVA教程

本文給大家分享java多線程實現異步調用的方法,感興趣的朋友跟著腳本之家小編一起學習吧

在JAVA平臺,實現異步調用的角色有如下三個角色:調用者 提貨單   真實數據

一個調用者在調用耗時操作,不能立即返回數據時,先返回一個提貨單.然后在過一斷時間后憑提貨單來獲取真正的數據.
去蛋糕店買蛋糕,不需要等蛋糕做出來(假設現做要很長時間),只需要領個提貨單就可以了(去干別的事情),等到蛋糕做好了,再拿提貨單取蛋糕就可以了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main { 
  public static void 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 (InterruptedException 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(),也就是拿提貨單獲取執行結果。

下面來看一下,顧客定蛋糕后,蛋糕店做了什么:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 void 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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class RealData implements Data { 
  private 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 (InterruptedException e) { 
      
    
    System.out.println("making RealData(" + count + ", " + c + ") END"); 
    this.content = new String(buffer); 
  
  public String getContent() { 
    return content; 
  
}

     現在來看看“提貨單”future是怎么與蛋糕"content"對應的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class FutureData implements Data { 
  private RealData realdata = null
  private boolean ready = false
  public synchronized void setRealData(RealData realdata) { 
    if (ready) {             
      return;   // 防止setRealData被調用兩次以上。
    
    this.realdata = realdata; 
    this.ready = true
    notifyAll(); 
  
  public synchronized String getContent() { 
    while (!ready) { 
      try
        wait(); 
      } catch (InterruptedException e) { 
      
    
    return realdata.getContent(); 
  
}

   顧客做完自己的事情后,會拿著自己的“提貨單”來取蛋糕:

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

這時候如果蛋糕沒做好,就只好等了:

?
1
2
3
4
5
6
7
while (!ready) { 
      try
        wait(); 
      } catch (InterruptedException e) { 
      
//等做好后才能取到  
return realdata.getContent();

    程序分析

    對于每個請求,host都會生成一個線程,這個線程負責生成顧客需要的“蛋糕”。在等待一段時間以后,如果蛋糕還沒有做好,顧客還必須等待。直到“蛋糕被做好”,也就是future.setRealData(realdata); 執行以后,顧客才能拿走蛋糕。

   每個線程只是專門負責制作特定顧客所需要的“蛋糕”。也就是顧客A對應著蛋糕師傅A,顧客B對應著蛋糕師傅B。即使顧客B的蛋糕被先做好了,顧客A也只能等待蛋糕師傅A把蛋糕做好。換句話說,顧客之間沒有競爭關系。

   類FutureData的兩個方法被設置為synchronized,實際上蛋糕師傅A與顧客A之間的互斥關系,也就是顧客A必須等待蛋糕師傅A把蛋糕做好后,才能拿走,而與蛋糕師傅B是否做好了蛋糕沒有關系。

本文內容就到此全部結束了,代碼簡單吧,希望對大家學習Java多線程實現異步調用有所幫助,謝謝。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 蛮荒的童话未删减在线观看 | 亚洲午夜精品久久久久久人妖 | 四虎欧美 | 国产一区二区三区水野朝阳 | 亚洲国产成人资源在线桃色 | 国产一区二区三区四 | 国产日韩在线 | 亚洲香蕉视频 | 99久久国产综合精品女不卡 | 深夜成人| 久久综合亚洲色hezyo | 白丝爆动漫羞羞动漫网站 | 蛮荒的童话未删减在线观看 | 扒开双腿羞辱调教play视频 | 99国产在线视频 | 农村脱精光一级 | 美女和男人差差 | 大奶妈咪女教师 | ts人妖系列在线专区 | 草莓在深夜释放自己软件 | 美女被网站| 欧美专区综合 | 春意午夜影院 | a毛片久久免费观看 | 99视频在线观看视频一区 | 日本在线不卡免 | 国产亚洲欧美日韩俺去了 | melody中文字幕 | 亚洲+欧美+国产+综合 | 亚洲一区二区日韩欧美gif | 我和寂寞孕妇的性事 | 草莓在线| 美女露全身永久免费网站 | 国内交换一区二区三区 | 秋霞午夜视频在线观看 | 国产我不卡 | 日本人作爰啪啪全过程 | 美国玩尿眼道videos | japonensis日本护士18 | 97热久久免费频精品99国产成人 | 国产日本免费 |