スレッドは常に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();
executorがこれを行い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
私は両方のリストが空でないとinitAndRunExecutionが呼び出されていることを確実に知るしかし、注文執行runメソッドが呼び出されていない....
'firstBuysList.get(0)'の代わりに 'firstBuysList.remove(0)'を試してみてください。 firstSellsと同じです... 'get'は要素を削除しません。だからあなたは非常に高い頻度で同じ2つの要素を提出する無限ループにいます。だから私はあなたのエグゼキュータスレッドが決してスケジュールされることはないと思う。 – Fildor
@Fildor、よく働かないでください... – kitsuneFox
ああ、私は大丈夫です。コメントを削除しました。これらのリストをどのように埋めるのですか? – JIV