当前位置:编程学习 > JAVA >>

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以后都不会初始化了,我是这么理解的。

引用 3 楼 jinsong1213 的回复:
1 从你的表述不能确定是多线程的问题,还有别的证据吗?贴出来大家讨论下
2 不知道你这个ThreadPoolExecutor在并发时servlet中的执行方式,从现有的描述来看这样是有问题的,第一个请求上来,pool启动,之后servlet返回。然后第二个请求上来,pool再次启动?池启动一次就好了吧。

3 有可能是我没太理解需求的缘故,所以问题很浅显,总是描述很少,多来点,我们臭皮匠们讨论下
--------------------编程问答-------------------- 这个很简单的,就是保存了图片的信息,可以理解为把图片保存位置传递过去了。

引用 2 楼 defonds 的回复:
Thumbnailer(fp);
没看到这个构造子
--------------------编程问答--------------------
引用 4 楼 tjhaua11 的回复:
1、我也不确定是哪里问题,目前要的效果就是有个图片a1.png,生成thumba1.png,然后另外一个servlet启动之后,会有个a2.png,理论上生成thumba2.png,但现在的事实是确实生成了thumba2.png,但这个图片打开来看却发现是a1.png的缩略图

2、static只会调用一次吧,pool以后都不会初始化了,我是这么理解的。

Quote: 引用 3 楼 jinsong1213 的回复:

1 从你的表述不能确定是多线程的问题,还有别的证据吗?贴出来大家讨论下
2 不知道你这个ThreadPoolExecutor在并发时servlet中的执行方式,从现有的描述来看这样是有问题的,第一个请求上来,pool启动,之后servlet返回。然后第二个请求上来,pool再次启动?池启动一次就好了吧。

3 有可能是我没太理解需求的缘故,所以问题很浅显,总是描述很少,多来点,我们臭皮匠们讨论下


建议你先把多线程去掉,改成单线程测试。 无非就是慢点呗 --------------------编程问答-------------------- 建议用这样的格式比较清爽

//1.没有这个构造,给个Thumbnailer 的完整代码
Thumbnailer thumbnailer = new Thumbnailer(fp);
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,