Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Fork连接池卡住了_Java_Multithreading_Concurrency - Fatal编程技术网

Java Fork连接池卡住了

Java Fork连接池卡住了,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个数据迁移服务,它从一个数据库中分块读取数据,然后将其迁移到另一个数据库中 为了处理数据块,我尝试使用递归操作和fork-join池。这样做的原因是我想并行地执行这些“块”上的工作,然后获得另一个块,然后执行,然后获得另一个块,等等 现在发生的是我的过程停止了。我在日志中没有看到异常,也没有看到死锁线程。我的代码如下,我的问题是: 我是不是在我的员工身上遗漏了什么?我是否需要返回一些值或调用一些方法来释放资源 我在这里使用递归动作真的很愚蠢吗?我应该使用不同的东西来并行化大量的工作吗 我

我有一个数据迁移服务,它从一个数据库中分块读取数据,然后将其迁移到另一个数据库中

为了处理数据块,我尝试使用递归操作和fork-join池。这样做的原因是我想并行地执行这些“块”上的工作,然后获得另一个块,然后执行,然后获得另一个块,等等

现在发生的是我的过程停止了。我在日志中没有看到异常,也没有看到死锁线程。我的代码如下,我的问题是:

  • 我是不是在我的员工身上遗漏了什么?我是否需要返回一些值或调用一些方法来释放资源
  • 我在这里使用递归动作真的很愚蠢吗?我应该使用不同的东西来并行化大量的工作吗
  • 我的线程转储中有一个工作线程似乎正在等待-这是正常的还是我的问题的某种指示
ForkJoinPool-1-worker-18 id=12191状态=等待 -等待(java.util.concurrent.ForkJoinPool) -锁定(java.util.concurrent.ForkJoinPool)在的sun.misc.Unsafe.park(本机方法) java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)位于 java.util.concurrent.ForkJoinPool.tryAwaitWork(ForkJoinPool.java:864) 位于java.util.concurrent.ForkJoinPool.work(ForkJoinPool.java:647) java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:398)

代码:

@组件
公共类BulkMigrationService{
最终ForkJoinPool池=新的ForkJoinPool();
私有静态最终记录器log=LoggerFactory.getLogger(BulkMigrationService.class);
私有源数据api;
专用最终迁移器迁移器;
私有元数据服务元数据服务;
@自动连线
public BulkMigrationService(SourceDataApi、Migrator Migrator、MetadataService MetadataService){
this.api=api;
this.migrator=migrator;
this.metadataService=metadataService;
}
public void migrate(整数batchSize,最大长度)抛出MigrationException{
长电流计数=0l;
整数currentIndex=0;
同时(当前计数<最大值){
List itemsToMigrate=api.findItemRange(currentIndex,currentIndex+batchSize);
如果(assetsToMigrate.size()>0){
MigrateForkedWorker starter=新的MigrateForkedWorker(AssetToMigrate);
pool.invoke(启动程序);
}
currentCount+=AssetToMigrate.size();
currentIndex+=batchSize-1;
if(log.isDebugEnabled()){
调试(“迁移的”+currentCount+“项”);
}
}
}
公共类MigrateForkedWorker扩展了RecursiveAction{
私人int最大值=10;
私人名单所有项目;
公共迁移MarkedWorker(列出所有项){
this.allItems=allItems;
}
@凌驾
受保护的void compute(){

如果(allItems.size()您的第一个问题是您正在使用invokeAll()。它只是向池提交新请求并等待它们完成。请遵循JavaDoc中的示例:use fork() migrateForkedWorkerOne.fork(); migrateForkedWorkerWO.compute();
migrateForkedWorkerOne.join();

我想知道我是否看到了这样的情况:我可能只是不太了解这些东西,无法使用它。最近在互联网上阅读:一位开发人员遇到了一个问题,尽管“我知道,我将使用线程”。现在他有10个问题
@Component
public class BulkMigrationService {

final ForkJoinPool pool = new ForkJoinPool();

private static final Logger log = LoggerFactory.getLogger(BulkMigrationService.class);

private SourceDataApi api;
private final Migrator migrator;
private MetadataService metadataService;

@Autowired
public BulkMigrationService(SourceDataApi api, Migrator migrator, MetadataService metadataService) {
    this.api = api;
    this.migrator = migrator;
    this.metadataService = metadataService;
}

public void migrate(Integer batchSize, Long max) throws MigrationException {

    Long currentCount = 0l;
    Integer currentIndex = 0;

    while (currentCount < max) {
        List<String> itemsToMigrate = api.findItemRange(currentIndex, currentIndex + batchSize);

        if (assetsToMigrate.size() > 0) {
            MigrateForkedWorker starter = new MigrateForkedWorker(assetsToMigrate);
            pool.invoke(starter);
        }

        currentCount += assetsToMigrate.size();
        currentIndex += batchSize - 1;
        if (log.isDebugEnabled()) {
            log.debug("Migrated " + currentCount + " Items.");
        }
    }

}

public class MigrateForkedWorker extends RecursiveAction {

    private int max = 10;
    private List<String> allItems;

    public MigrateForkedWorker(List<String> allItems) {
        this.allItems = allItems;

    }

    @Override
    protected void compute() {
        if (allItems.size() <= max) {
            for (String itemInfo : allItems) {

                try {
                    migrator.migrateAsset(itemInfo);

                }
                catch (MigrationException e) {
                    e.printStackTrace();
                }
            }
        }
        else {
            int targetSize = allItems.size() % 2 == 0 ? allItems.size() / 2 : (allItems.size() + 1) / 2;
            List<List<String>> splits = Lists.partition(allItems, targetSize);
            MigrateForkedWorker migrateForkedWorkerOne = new MigrateForkedWorker(splits.get(0));
            MigrateForkedWorker migrateForkedWorkerTwo = new MigrateForkedWorker(splits.get(1));

            invokeAll(migrateForkedWorkerOne, migrateForkedWorkerTwo);
        }
    }
}
 }