执行程序不在主线程内执行线程

时间:2017-02-02 08:51:58

标签: java multithreading

我有一个始终使用while(true)循环运行的Thread,基本上所做的就是将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,但是没有调用订单执行运行方法....

1 个答案:

答案 0 :(得分:1)

  

我确定两个列表都不为空并且正在调用initAndRunExecution,但是没有调用订单执行运行方法....

我怀疑这是一个问题,因为您的firstSellsListfirstBuysList不是同步集合。我怀疑其他线程正在添加到这些列表,但是你的OrderExecutionThread从未看到内存更新,所以只是旋转永远看到空列表。每当您在线程之间共享数据时,您需要担心如何发布更新以及如何更新线程缓存内存。

正如@Fildor在评论中提到的,一种解决方案是使用BlockingQueue而不是ListBlockQueue(例如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);
}

这将等到列表在运行订单之前获得条目。

相关问题