我正在从独立应用程序移植一些代码以拥有基于Web的前端。我们使用wildfly 11.0作为容器。代码大量使用线程,我不知道如何在JEE中实现它。在partiular的secton上使用管道流,其中一个进程写入其中,另一个进程读取它。这两个进程都执行文件IO并可能阻止。代码部分负责压缩大型目录树并将zip文件分块为多个单独的文件。这是一个长时间运行的过程,因为要压缩的目录在千兆字节范围内。如何管理在JEE中通过管道输入流连接的两个线程的分叉,或者是否有实现相同结果的最佳实践。
以下是有问题的代码示例
ExecutorService Executor = Executors.newCachedThreadPool();
File directoryToZip = new File(dirToZipName);
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
pos.connect(pis);
List<File> fileList = new ArrayList<File>();
// get all files into a list
getAllFiles(directoryToZip, fileList);
Callable<Void> producer = () -> writeZipFile(pos, directoryToZip,fileList);
Callable<FileMetaData> consumer = () -> FileSplitter.splitFile(pis,directoryToZip.getName(), new File(outputDir), 1024);
Future<FileMetaData> future = Executor.submit(consumer);
Executor.submit(producer);
future.get();
Executor.shutdown();