Arch-03-13-JMagic 切割图少时,使用多线程异步大幅提高性能
Arch-03-13-JMagic 切割图片时,使用多线程异步大幅提高性能
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); } ...