我有一个始终使用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
,但是没有调用订单执行运行方法....
答案 0 :(得分:1)
我确定两个列表都不为空并且正在调用initAndRunExecution,但是没有调用订单执行运行方法....
我怀疑这是一个问题,因为您的firstSellsList
和firstBuysList
不是同步集合。我怀疑其他线程正在添加到这些列表,但是你的OrderExecutionThread
从未看到内存更新,所以只是旋转永远看到空列表。每当您在线程之间共享数据时,您需要担心如何发布更新以及如何更新线程缓存内存。
正如@Fildor在评论中提到的,一种解决方案是使用BlockingQueue
而不是List
。 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);
}
这将等到列表在运行订单之前获得条目。