
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
package froala.editor.service;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import froala.editor.utils.FileUtil;
/**
* 다중 쓰레드 파일 업로드
*
* @since 2020. 8. 29.
* @author 임종호
*
* <PRE>
* -----------------------
* 개정이력
* 2020. 8. 29. 임종호 : 최초작성
* </PRE>
*/
public class ParallelExcutorService {
private static final Logger LOGGER = LoggerFactory.getLogger(ParallelExcutorService.class);
// private final int maxCore = Runtime.getRuntime().availableProcessors();
// private final ExecutorService executor = Executors.newFixedThreadPool(maxCore);
private final ExecutorService executor = Executors.newCachedThreadPool();
private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
public ParallelExcutorService() {
}
/**
* start : 시작번호, repeat : 반복횟수, max : pdf파일 최대번호, pdfRenderer : PDFBox 객체,
* returnFileRoute : 이미지 파일저장경로
*
* @Author : 임종호
* @Date : 2020. 8. 29.
* @Method Name : submit
* @return : void
*/
public void pdfSubmit(String job, int start, int repeat, int max, PDFRenderer pdfRenderer, String returnFileRoute) {
executor.submit(() -> {
for (int i = start; i < repeat * 3 + start;) {
int fileIndex = i + 1;
if (max < fileIndex) {
break;
}
String imgFileName = returnFileRoute + '_' + fileIndex + ".png";
java.io.File existCheck2 = new java.io.File(imgFileName);
if (!existCheck2.exists()) {
// 순회하며 이미지로 변환 처리
FileUtil.pdfImageWrite(pdfRenderer, i, imgFileName);
}
i += repeat;
}
String threadName = Thread.currentThread().getName();
String result = job + ", " + threadName;
try {
queue.put(result);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
public String take() {
try {
return queue.take();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException(e);
}
}
public void close() {
List<Runnable> unfinishedTasks = executor.shutdownNow();
if (!unfinishedTasks.isEmpty()) {
LOGGER.error("Not all tasks finished before calling close: " + unfinishedTasks.size());
}
}
}