java等待異步執行完成後

本文目錄一覽:

java異步方法什麼意思

在JAVA平台,實現異步調用的角色有如下三個角色:調用者,取貨憑證,真實數據

異步調用就是:一個調用者在調用耗時操作,不能立即返回數據時,先返回一個取貨憑證.然後在過一斷時間後憑取貨憑證來獲取真正的數據.

如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下採用異步途徑往往更有效率

只有一個馬桶

很多人上廁所

要排隊

這叫同步迅雷一次可以下載很多東西

這叫異步

Java 怎麼在Main函數中,執行完異步任務後才退出主線程

要實現這個情況,必須知道以下幾點

1、java中線程的結束是由run方法運行完成後自動結束的

2、在main線程(主線程)中,需要得到所有線程的引用。

3、知道jdk提供的CountDownLatch的用法

例子如下:

public static void main(String[] args) throws InterruptedException

{

//CountDownLatch作為計數器紀錄有幾個線程,例如有2個線程

CountDownLatch latch=new CountDownLatch(2);

Worker worker1=new Worker( latch);

Worker worker2=new Worker(latch);

worker1.start();// 啟動線程

worker2.start();//

//等待所有工人完成工作

latch.await();

System.out.println("all work done at "+sdf.format(new Date()));

}

class Worker extends Thread

{

private CountDownLatch latch;

public Worker(CountDownLatch latch)

{

this.latch = latch;

}

public void run()

{

xxxxx

//在run方法結束之前,講線程計數器減一

latch.countDown();

}

}

java 異步調用方法

asynchronous call(異步調用)

一個可以無需等待被調用函數的返回值就讓操作繼續進行的方法

中文名

異步調用

外文名

asynchronous call

領域

函數

傑作

線程

快速

導航

實戰用法異步調用使用方法

舉例

異步調用就是你 喊 你朋友吃飯 ,你朋友說知道了 ,待會忙完去找你 ,你就去做別的了。

同步調用就是你 喊 你朋友吃飯 ,你朋友在忙 ,你就一直在那等,等你朋友忙完了 ,你們一起去。

實戰用法

操作系統發展到今天已經十分精巧,線程就是其中一個傑作。操作系統把 CPU 處理時間劃分成許多短暫時間片,在時間 T1 執行一個線程的指令,到時間 T2又執行下一線程的指令,各線程輪流執行,結果好象是所有線程在並肩前進。這樣,編程時可以創建多個線程,在同一期間執行,各線程可以“並行”完成不同的任務。

在單線程方式下,計算機是一台嚴格意義上的馮·諾依曼式機器,一段代碼調用另一段代碼時,只能採用同步調用,必須等待這段代碼執行完返回結果後,調用方才能繼續往下執行。有了多線程的支持,可以採用異步調用,調用方和被調方可以屬於兩個不同的線程,調用方啟動被調方線程後,不等對方返回結果就繼續執行後續代碼。被調方執行完畢後,通過某種手段通知調用方:結果已經出來,請酌情處理。

java隊列實現異步執行

在整個思路上要調整一下

1、會有很多線程給一個隊列上添加任務

2、有一個或者多個線程逐個執行隊列的任務

考慮一下幾點:

1、沒有任務時,隊列執行線程處於等待狀態

2、添加任務時,激活隊列執行線程,全部run起來,首先搶到任務的執行,其他全部wait

給個小例子吧

packageorg;

importjava.util.LinkedList;

importjava.util.List;

publicclassQueues{

publicstaticListTaskqueue=newLinkedListTask();

/**

*假如參數o為任務

*@paramo

*/

publicstaticvoidadd(Taskt){

synchronized(Queues.queue){

Queues.queue.add(t);//添加任務

Queues.queue.notifyAll();//激活該隊列對應的執行線程,全部Run起來

}

}

staticclassTask{

publicvoidtest(){

System.out.println("我被執行了");

}

}

}

packageorg;

importjava.util.List;

publicclassExecimplementsRunnable{

@Override

publicvoidrun(){

while(true){

synchronized(Queues.queue){

while(Queues.queue.isEmpty()){//

try{

Queues.queue.wait();//隊列為空時,使線程處於等待狀態

}catch(InterruptedExceptione){

e.printStackTrace();

}

System.out.println("wait…");

}

Queues.Taskt=Queues.queue.remove(0);//得到第一個

t.test();//執行該任務

System.out.println("end");

}

}

}

publicstaticvoidmain(String[]args){

Exece=newExec();

for(inti=0;i2;i++){

newThread(e).start();//開始執行時,隊列為空,處於等待狀態

}

//上面開啟兩個線程執行隊列中的任務,那就是先到先得了

//添加一個任務測試

Queues.Taskt=newQueues.Task();

Queues.add(t);//執行該方法,激活所有對應隊列,那兩個線程就會開始執行啦

}

}

上面的就是很簡單的例子了

java常見的幾種調用機制(同步調用,異步調用

1、同步調用

同步調用是最基本的調用方式,對象b中的方法直接調用對象a的方法,這個時候程序會等待對象a的方法執行完返回結果之後才會繼續往下走。

代碼如下:

public class A {

public void methodA()

{

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.methodA();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

結果:

this is class A method

this is class B method

2、異步調用

對象b中的方法調用對象a的方法,程序並不需要等待對象a的方法返回結果值,直接繼續往下走。

代碼如下:

public class A extends Thread{

@Override

public void run() {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("this is class A method");

}

}

public class B {

public void methodB()

{

A a = new A();

a.start();

System.out.println("this is class B method");

}

}

public class Test {

public static void main(String[] args) {

B b = new B();

b.methodB();

}

}

結果:

this is class B method

this is class A method

說明:異步調用我們通常採用多線程的方法來達到目的

3、回調

對象a的方法methodA()中調用對象b的methodB()方法,在對象b的methodB()方法中反過來調用對象a的callBack()方法,這個callBack()方法稱為回調函數,這種調用方法稱為回調。

代碼如下:

public class A {

public void methodA()

{

B b = new B();

b.methodB(new A());

System.out.println("this is class A method : methodA");

}

public void callBack()

{

System.out.println("this is class A method : callBack");

}

}

public class B {

public void methodB(A a)

{

System.out.println("this is class B method : methodB");

a.callBack();

}

}

public class Test {

public static void main(String[] args) {

A a = new A();

a.methodA();

}

}

運行結果:

this is class B method : methodB

this is class A method : callBack

this is class A method : methodA

注意:這裡如果為了代碼的擴展性更好,可以把類A與類B抽象出一個接口出來,然後用實現類去實現着兩個接口,這樣代碼的擴展性會更好,也能滿足更多的業務場景。

回調的核心在於:回調方將本身對象傳給調用方,調用方在本身代碼邏輯執行完之後,調用回調方的回調方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/270192.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:35
下一篇 2024-12-16 13:35

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論