【问题标题】:make code async with forJoinPool使用 forJoinPool 使代码异步
【发布时间】:2018-06-07 11:31:24
【问题描述】:

您好,我有 try catch 结构,并希望在 finally 语句中使代码异步。我尝试将此部分放入 lambda 并转换为任务,将其放入 ForkJoinPool,但存在 Class Cast Exception。如何使这部分代码更好地异步。我必须在字段之前使用 atomic 或 volatile 吗?

    public class Record {
        private String actionDetails;

        public void setActionDetails(String actionDetails) {
            this.actionDetails = actionDetails;
        }
    }

    public class Recorder {
        private Record record;

        public void record(Record record){
            this.record = record;
        }
    }

public class Test {
    private static Recorder recorder = new Recorder();
    private static StringBuilder builder;

    public static void main(String[] args) {
        try {
            // other code
            builder.append("Test");

        } finally {
            Runnable runnable = () -> {
                final Record record = new Record();
                record.setActionDetails(builder.toString());
                recorder.record(record);
            };

            ForkJoinTask<?> task = (ForkJoinTask<?>)runnable;

            ForkJoinPool pool = new ForkJoinPool();
            pool.invoke(task);

        }
    }
}

【问题讨论】:

  • 我真的不明白你想做什么,但它给我带来了几个危险信号。
  • 类似于记录失败的尝试,这是您想要实现的目标吗?
  • 抱歉代码错误。

标签: java multithreading concurrency runnable


【解决方案1】:

我的意思是这样的:

ForkJoinPool pool = new ForkJoinPool();
pool.submit(() -> {
        final Record record = new Record();
        record.setActionDetails(builder.toString());
        recorder.record(record);
});

但是否需要在字段之前使用一些修饰符?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2012-01-18
    • 2017-07-16
    • 2012-03-26
    • 2017-08-19
    • 2014-07-18
    相关资源
    最近更新 更多