`

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);

   }

...
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics