多线程中的AspectJ

问题描述 投票:0回答:1

目前我正在开发一个在 16 个线程上并行运行相同进程(在本例中具有不同输入参数的 TaskInformation)的应用程序。我想创建一个方面,从中获取参数和值并将它们存储在我将在方面创建的对象中。

我的问题是这个对象是为每个线程独立创建的,我可以以某种方式调用该对象的确切实例,以便我可以为每个线程存储正确的值。

如果可能的话,我会避免使用 threadLocal,因为这是我目前在没有方面使用的东西,我希望如果可能的话我可以避免它。

感谢您提前提供帮助!

我正在使用 threadLocal,我想重构它。

编辑: 我们有一个 Process 类,在其中查看 process 方法,该方法在多个线程中同时运行。我想用每个线程的信息填充 LoggingObject,并在最后将它们记录为整个处理的摘要。

示例:

    public aspect MyAspect {

private final LoggingObject log = new LoggingObject()

        pointcut processMethodExecution(TaskInformation taskInfo):
        execution(TaskStatus Processor.process(TaskInformation)) && args(taskInfo);

        after(TaskInformation taskInfo): processMethodExecution(taskInfo) {
        logger.info("Processing task with ID: " + taskInfo.getTaskId());
        log.setID(taskInfo.getTaskId())
        }
        }
java concurrency aop aspect
1个回答
0
投票

您有多种选择:

  • 继续使用线程本地字段(如果它适合您)。我觉得没什么问题。

  • 用映射替换线程本地,其中线程 ID 作为键,数据作为值。但是,如果您使用线程池等,请小心,因为这样线程将被重复使用。确保以能够按预期初始化数据的方式设计您的方面。但实际上,线程本地也是如此。

  • 选择一个非单方面实例化模型,如我的答案中所述,或者类似地此处中所述。答案还指向 AspectJ 手册,它为您提供了更多技术细节。

© www.soinside.com 2019 - 2024. All rights reserved.