[英]Waiting for something to finsih, should I use thread.sleep or ReentrantLock?
我有一個 Java 程序。 邏輯如下:
使用盈透證券/幣安 API 下訂單。 訂單成交后,API 回調方法將返回一條消息。
問題是我不知道如何寫出代碼來識別訂單已被執行,所以我可以立即執行“calculateSomething”方法,等待時間最短。
我可以想到兩種方法:
ReentrantLock
。 方法 1 有效,但不是即時的。 因此,我正在探索ReentrantLock
,但我不確定代碼是否正確。 盡管如此,哪種方法最有效,訂單完成后可以立即執行“calculateSomething”如果有更有效的方法,請給我一些幫助,因為我在這個問題上卡了很多天。
下面的偽代碼。
placeOrder(); // place order to binance <- API method
while(order is not completed){
Thread.sleep(1000)
if(order is completed){
return
}
}
calculateSomething();
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.