ForkJoin实战

需求

解析2.8G的dicom文件,并且修改文件内容,将源文件删除后再创建新文件。

实现

public class AnonymousTask extends RecursiveAction {


    //要搜寻的目录
    private File dir;

    public AnonymousTask(File dir) {
        this.dir = dir;
    }

    @Override
    protected void compute() {
        File[] files = dir.listFiles();
        if (files != null) {
            List<AnonymousTask> list = new ArrayList<>();
            for (File file : files) {
                //如果是目录,就需要分割任务,交给ForkJoinPool去执行,因为任务数目不确定,所以需要定义一个集合
                if (file.isDirectory()) {
                    AnonymousTask findFiles = new AnonymousTask(file);
                    list.add(findFiles);

                    //不是目录,是文件就执行自己的逻辑
                } else {
                    if (!file.getAbsolutePath().endsWith("mim")) {
                        parseDicom(file);
                    }
                }
            }
            //如果任务
            if (list.size() > 0) {
                Collection<AnonymousTask> findFiles = invokeAll(list);
                for (AnonymousTask findFiles1 : findFiles) {
                    //等待所有的任务执行完成
                    findFiles1.join();
                }
            }
        }
    }


    private void parseDicom(File ctFile) {
        DicomInputStream cis = null;
        DicomOutputStream dos = null;
        try {
            cis = new DicomInputStream(ctFile);
            DicomObject dicomObject = cis.readDicomObject();
            dicomObject.putString(Tag.PatientName, VR.PN, "***");
            ctFile.delete();

            dos = new DicomOutputStream(new BufferedOutputStream(new FileOutputStream(ctFile)));
            dos.writeDicomFile(dicomObject);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (cis != null)
                    cis.close();
                if (dos != null)
                    dos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    private static void testFork() {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        AnonymousTask findFiles = new AnonymousTask(new File("C:\\Users\\CemB\\Desktop\\test2\\"));

        //execute方法是异步的
        forkJoinPool.execute(findFiles);

        //阻塞,等待ForkJoin执行完,主线程才往下执行
        findFiles.join();

    }


    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        testFork();
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start));
    }

}

结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值