当前位置: 首页 > 知识库问答 >
问题:

不从主线程内执行线程的执行器

郭凯
2023-03-14
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();
@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,但是没有调用order execution run方法....

共有1个答案

马寒
2023-03-14

我确信这两个列表都不是空的,并且正在调用initAndRunExecution,但是没有调用order execution run方法....

我怀疑这是一个问题,因为FirstSellsListFirstBuysList不是同步集合。我怀疑其他线程正在添加到这些列表中,但是OrderExecutionThread从来没有看到内存更新,所以只能永远看到空列表。无论何时在线程之间共享数据,都需要担心更新将如何发布,以及线程缓存内存将如何更新。

正如@Fildor在注释中提到的,一个解决方案是使用blockingqueues而不是lists。BlockQueue(例如LinkedBlockingQueue)是一个同步类,因此它负责内存共享。另一个好处是,您不必执行旋转循环来观察条目。

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);
}
 类似资料:
  • 本文向大家介绍iOS 在主线程上执行,包括了iOS 在主线程上执行的使用技巧和注意事项,需要的朋友参考一下 示例 当异步执行任务时,通常需要确保在主线程上运行一段代码。例如,您可能要异步访问REST API,但将结果放在屏幕上的UILabel中。在更新UILabel之前,必须确保您的代码在主线程上运行: 每当您更新屏幕上的视图时,请始终确保您正在主线程上执行此操作,否则可能会发生未定义的行为。

  • 我很难理解内部类线程的行为。 它总是打印出“main”,并且线程是按顺序执行的。为什么内部类线程的执行由主线程执行? 谢谢!

  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • 我需要执行一些任务。有些任务是独立的,有些任务依赖于其他任务的成功执行。独立任务可以并行运行以获得更好的性能。我把这些任务称为服务。列说明哪些服务将以串联方式执行,哪些服务将以并联方式执行。列描述了一组定义的服务所遵循的执行顺序。例如,服务A和B应该并行运行。如果它们已成功执行,则将执行服务C。请注意,服务C并不直接依赖于其先前服务的输出,但它必须在成功执行其先前服务后运行,因为服务C在执行期间需

  • 问题内容: 我的任务是按以下顺序创建线程:如果A开始->启动B和C,如果B开始->启动D。并以相反的顺序销毁它们如果D然后B。如果B和C然后A。它。我设法做到了,但我想还有更好的方法。你有什么建议吗? 在您发表评论后,我更改了代码,这非常简单。但是现在看起来“愚蠢”。我想更改if语句和实现的硬性,有什么建议吗?寻求建议,我正在与您一起学习。 这是我的新代码: 问题答案: 您的代码中存在一些缺陷,这

  • 6.7.2.多线程执行 与在单线程中阻塞相比,更好的做法是让程序运行在多个线程之中。系统负责分配CPU时间,几个线程仿佛在同一时刻同时运行。这样可以避免某线程独占计算资源。 图6.10. 多线程执行 在例子中,我们将网络操作的相关代码放到独立的线程里面。这样我们的主线程可以避免阻塞在网络操作上,用户界面不会响应不灵。按惯例,我们一般认为主线程是运行于前台,而其它的线程都是运行于后台。这是因为前端的