2017-02-02 48 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); 
} 

这将等到列出了正在运行的订单之前得到的条目。

相关问题