首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从RecursiveTask继承的抽象类

从RecursiveTask继承的抽象类
EN

Stack Overflow用户
提问于 2015-02-03 11:02:28
回答 1查看 259关注 0票数 2

我有问题要解决一个问题。首先,我有一个从RecursiveTask继承的抽象类:

代码语言:javascript
复制
public abstract class GeneratorTaskBase<T, U extends RecursiveTask<T>> extends RecursiveTask<T> {
        @Override
protected T compute() {
    LOG.debug("Computing: start={}, end={}", start, end);
    if (end - start <= THRESHOLD) {
        try {
            return process();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    } else {
        final int mid = start + (end - start) / 2;
        final U leftTask = getTask(start, mid);
        final U rightTask = getTask(mid, end);

        leftTask.fork();
        rightTask.fork();

        final T leftResult = leftTask.join();
        final T rightResult = rightTask.join();

        return getResult(leftResult, rightResult);
    }
}

    protected abstract T getResult(T leftResult, T rightResult);

    protected abstract T process() throws Exception;

    protected abstract U getTask(final int start, final int end);

    protected abstract String generate();

}

子类

代码语言:javascript
复制
public class SqlGenerator extends GeneratorTaskBase<String, SqlGenerator> {


@Override
public String generate() {
    this.end = this.files.size();
    return this.invoke();
}

@Override
protected SqlGenerator getTask(final int start, final int end) {
    return new SqlGenerator(this.path).files(files).start(start).end(end);
}


}

我要求这样的任务:

代码语言:javascript
复制
public final class CsvAsSqlDataProcessor implements
    DataProcessor<String, FileInput> 
@Override
public void process(FileInput input) {
    final String fileName = input.source().getName();
    final String directory = input.getDirectory();

    LOG.debug("directory: {}", directory);

    try {
        final CSVReader reader = new CSVReader(new FileReader(directory
                .concat(File.separator).concat(fileName)),
                SEMICOLON_DELIMETER);

        final List<String[]> rows = reader.readAll();

        reader.close();

        fullInsertStatement = new InsertSqlGenerator(rows, input.source())
                .generate();

    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

当我运行它时,我得到了一个例外:

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: java.lang.Thread     cannot be cast to java.util.concurrent.ForkJoinWorkerThread
    at java.util.concurrent.ForkJoinTask.fork(ForkJoinTask.java:622)
    at com.bosch.mome.importer.batch.export.sql.GeneratorTaskBase.compute(GeneratorTaskBase.java:40)
    at java.util.concurrent.RecursiveTask.exec(RecursiveTask.java:93)
    at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:377)
    at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:654)
    at com.bosch.mome.importer.batch.export.sql.SqlGenerator.generate(SqlGenerator.java:69)

有人能告诉我我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-03 11:35:41

我就这样解决了:

代码语言:javascript
复制
@Override
public String generate() {
    this.end = this.files.size();
    ForkJoinPool pool = new ForkJoinPool();
    pool.execute(this);
    return this.join(); 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28297286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档