簡體   English   中英

等待完成某些事情,我應該使用 thread.sleep 還是 ReentrantLock?

[英]Waiting for something to finsih, should I use thread.sleep or ReentrantLock?

我有一個 Java 程序。 邏輯如下:

  1. 下訂單(依靠盈透證券/幣安API)
  2. 一旦訂單被執行(會有來自 API 的回調),立即執行一個名為“calculateSomething”的方法

使用盈透證券/幣安 API 下訂單。 訂單成交后,API 回調方法將返回一條消息。

問題是我不知道如何寫出代碼來識別訂單已被執行,所以我可以立即執行“calculateSomething”方法,等待時間最短。

我可以想到兩種方法:

  1. while 循環和 thread.sleep
  2. ReentrantLock

方法 1 有效,但不是即時的。 因此,我正在探索ReentrantLock ,但我不確定代碼是否正確。 盡管如此,哪種方法最有效,訂單完成后可以立即執行“calculateSomething”如果有更有效的方法,請給我一些幫助,因為我在這個問題上卡了很多天。

下面的偽代碼。

方法 1 - thread.sleep

placeOrder(); // place order to binance <- API method
while(order is not completed){
     Thread.sleep(1000)
     if(order is completed){
          return
     }
}
calculateSomething();

方法 2 - 可重入鎖

ReentrantLock lock = new ReentrantLock();
lock.lock();
System.out.println("1. Locked");
try {
     while(lock.isLocked()) {
          if(isOrderCompleted() == true){
               lock.unlock();
          }
     }
} catch(Exception e){
     e.printStackTrace();
}finally {
     if(lock.isLocked()) {
          lock.unlock();
     }
}
calculateSomething();

你可以有一個阻塞隊列。

BlockingQueue<?> finishedOrders = new ArrayBlockingQueue<>(512);

然后你有一個處理完成訂單的循環。

public void processFinishedOrders() throws InterruptedException{
    
    while(!Thread.interrupted()){
        finishedOrders.take();
        doSomethingRelevant();
    }
}

我還建議使用有意義的 class 填充 finishedOrders。

BlockingQueue<Order> finishedOrders;

Order fin = finishedOrders.take();
doSomethingRelevant( fin );

這樣,等待 api 調用的線程可以創建一個訂單並將其添加到已完成的訂單隊列中,處理線程將擁有相關信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM