2017-02-02 86 views
0

內執行的線程我有一個與while(true)循環總是一個線程,基本上它所做的就是Runnable對象添加到一個執行者。執行人不是從主線程

OrderExecutionThread:

public class OrderExecutionThread extends Thread implements Runnable { 
    final private static int ORDER_EXEC_THREADS_NUMBER = 10; 
    private boolean running = true; 
    private boolean flag = true; 

    private List<Order> firstSellsList = new ArrayList<>(); 
    private List<Order> secondSellsList = new ArrayList<>(); 

    private ManagedDataSource managedDataSource; 
    private ExecutorService executorService; 

    public OrderExecutionThread(ManagedDataSource managedDataSource) { 
     this.managedDataSource = managedDataSource; 
     this.executorService = Executors.newFixedThreadPool(ORDER_EXEC_THREADS_NUMBER); 
    } 

@Override 
    public void run() { 
     while (running) { 
      if (!firstSellsList.isEmpty() && !firstBuysList.isEmpty()) { 
       initAndRunExecution(firstBuysList.get(0), firstSellsList.get(0)); 
     } 

    } 

    private void initAndRunExecution(Order buy, Order sell) { 
     executorService.submit(new OrderExecution(buy, sell, managedDataSource)); 
    } 
} 

我跑這個線程通過我的主類這樣做:

new Thread(orderExecutionThread).start(); 

假設執行人執行OrderExecution runnable對象,做到這一點:

@Override 
    public void run() { 
     try { 
      connection = managedDataSource.getConnection(); 
      makeExecution(sell, buy); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (!connection.isClosed()) 
        connection.close(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

我知道這兩個清單都不是空的,initAndRunExecution被調用,但是爲了執行run方法不會被調用....

+0

嘗試'firstBuysList.remove(0)'代替'firstBuysList.get(0)'。 firstSells一樣...'get'不會刪除元素。所以你處於無限循環中,以非常高的頻率提交相同的兩個元素。所以我懷疑你的Executor線程根本就不會被調度。 – Fildor

+0

@Fildor,刪除不工作以及... – kitsuneFox

+0

哦,我看得好。刪除了我的評論。你如何填寫這些列表? – JIV

回答

1

我肯定知道這兩個列表不爲空並且initAndRunExecution被調用,但是爲了執行run方法是不被稱爲....

我懷疑這是一個問題,因爲您的firstSellsListfirstBuysList不是同步集合。我懷疑其他線程正在添加到這些列表中,但您的OrderExecutionThread永遠不會看到內存更新,因此只會永遠看到空列表。無論何時在線程之間共享數據,您都需要擔心更新將如何發佈以及線程緩存內存將如何更新。

正如@Fildor在評論中提到的,一種解決方案是使用BlockingQueue而不是List s。 BlockQueue(例如LinkedBlockingQueue)是一個同步類,因此這需要處理內存共享。另一個好處是你不必做旋轉循環來觀察條目。

例如,您可能OrderExecutionThread做這樣的事情:

private final BlockingQueue<Order> firstBuys = new LinkedBlockingQueue<>(); 
private final BlockingQueue<Order> firstSells = new LinkedBlockingQueue<>(); 

while (!Thread.currentThread().isInterrupted()) { 
    // wait until we get a buy 
    Order buy = firstBuys.take(); 
    // wait until we get a sell 
    Order sell = firstSells.take(); 
    initAndRunExecution(buy, sell); 
} 

這將等到列出了正在運行的訂單之前得到的條目。

相關問題