servlet多线程问题求教
目前在做一个项目的时候,servlet处理了基本请求之后就返回了,同时调用ThumbnailServer 执行thumbnailer去做缩略图相关的操作,生成与原图文件名相关的缩略图,但是实际发现某些缩略图的名字跟原图名字对应不上了,看起来是多线程的问题,但是不知道怎么处理,哪位大侠帮帮忙看下?
public class Thumbnailer implements Runnable,Serializable{
createThumbnail(fromname, toname1, toHeight);
private boolean createThumbnail(String fromname, String toname, int toHeight){
boolean flag = false;
ImageInfo info;
try {
info = new ImageInfo(fromname);
MagickImage fromImage = new MagickImage(info);
Dimension dim = fromImage.getDimension();
double w = dim.getWidth();
double h = dim.getHeight();
int toWidth = (int)(w*toHeight/h);
MagickImage toImage = fromImage.scaleImage(toWidth, toHeight);
toImage.setFileName(toname);
toImage.writeImage(info);
flag = true;
} catch (MagickException e) {
e.printStackTrace();
}
return flag;
}
。。
}
public class ThumbnailServer {
private static ThumbnailServer thumbnailserver = new ThumbnailServer();
private ThumbnailServer(){
}
public ThumbnailServer getInstance(){
return thumbnailserver;
}
private static ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 2, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());
public static void createThumbnail(FileProperty fp){
Thumbnailer thumbnailer = new Thumbnailer(fp);
pool.execute(thumbnailer);
}
}
--------------------编程问答-------------------- 有人帮我吗? 或者我表述的不清楚? --------------------编程问答-------------------- Thumbnailer(fp);
没看到这个构造子 --------------------编程问答-------------------- 1 从你的表述不能确定是多线程的问题,还有别的证据吗?贴出来大家讨论下
2 不知道你这个ThreadPoolExecutor在并发时servlet中的执行方式,从现有的描述来看这样是有问题的,第一个请求上来,pool启动,之后servlet返回。然后第二个请求上来,pool再次启动?池启动一次就好了吧。
3 有可能是我没太理解需求的缘故,所以问题很浅显,总是描述很少,多来点,我们臭皮匠们讨论下 --------------------编程问答-------------------- 1、我也不确定是哪里问题,目前要的效果就是有个图片a1.png,生成thumba1.png,然后另外一个servlet启动之后,会有个a2.png,理论上生成thumba2.png,但现在的事实是确实生成了thumba2.png,但这个图片打开来看却发现是a1.png的缩略图
2、static只会调用一次吧,pool以后都不会初始化了,我是这么理解的。
--------------------编程问答-------------------- 这个很简单的,就是保存了图片的信息,可以理解为把图片保存位置传递过去了。
--------------------编程问答--------------------
建议你先把多线程去掉,改成单线程测试。 无非就是慢点呗 --------------------编程问答-------------------- 建议用这样的格式比较清爽
//1.没有这个构造,给个Thumbnailer 的完整代码
Thumbnailer thumbnailer = new Thumbnailer(fp);
补充:Java , Web 开发