JMagic 切割图片时,使用多线程异步大幅提高性能
由于使用 jQuery blueimp 的上传组件及 yoxView 显示组件,图片上传后自动切割成8个不同规格的图片,如果采用单线程处理 10x3M 的文件需要 2分20秒,如果加入了多线程异步(并做了单线程优先生成即时显示的缩略图)需要 53秒,完成任务是一样的,而对于前端的用户体验差别明显。
...
if(profile != null){
final ThumbnailSize[] sizes = profile.getSizes();
final String finalNewFilePath =newFilePath;
final boolean keepRatio = true;
if(sizes.length>0){
// 特殊处理,先切割前端即时显示的缩略图
if(IS_PREGENERATE_THUMBNAIL){
final int width_ = PREGENERATE_THUMBNAIL_SIZE.getWidth();
final int height_ = PREGENERATE_THUMBNAIL_SIZE.getHeight();
String thumbnailPath = PhotoBean.getPhotoThnumailPath(photo.getVolumeId(), photo.getId(),suffix, width_, height_);
final String thumbnailPath_ = FileUtil.getFilePathUploadFileUri(thumbnailPath);
ImageUtil.resize(finalNewFilePath, thumbnailPath_, width_, height_, keepRatio);
}
// 处理余下的尺寸
for(int i=0; i<sizes.length; i++){
// 略过之前即时处理过的尺寸
if(IS_PREGENERATE_THUMBNAIL &&(sizes[i].getWidth()==PREGENERATE_THUMBNAIL_SIZE.getWidth())
&&(sizes[i].getHeight()==PREGENERATE_THUMBNAIL_SIZE.getHeight())){
continue;
}
final int width_ = sizes[i].getWidth();
final int height_ = sizes[i].getHeight();
String thumbnailPath = PhotoBean.getPhotoThnumailPath(photo.getVolumeId(), photo.getId(),suffix, width_, height_);
final String thumbnailPath_ = FileUtil.getFilePathUploadFileUri(thumbnailPath);
Runnable syncResizeImage= new Runnable() {
public void run() {
ImageUtil.resize(finalNewFilePath, thumbnailPath_, width_, height_, keepRatio);
if (width_ >= 600)//只有当待切割的图片宽大于或等于600时才打印上水印
ImageWatermarksUtil.pressImage(watermarkerImgPath, thumbnailPath_, 20, 20);
System.out.println("newFilePath=="+finalNewFilePath +",--"+thumbnailPath_+","+width_+","+height_+","+keepRatio);
}
};
this.execute(syncResizeImage);
}
}
}
...
...
private void execute(Runnable runnable){
if(this.executor==null){
logger.debug("New fixed Thread Pool size is 10.");
this.executor =Executors.newFixedThreadPool(10);
}
executor.execute(runnable);
}
...