我正在为以下代码寻找更好的解决方案,我有一个 servlet 必须在用户按下一个按钮时处理请求,然后才能执行任何操作我希望我的函数等待另一个线程结束他正在做的事情,因为现在我正在使用一个简单的会话来做这件事:
boolean converted = (Boolean) request.getSession().getAttribute("converterthread");
while(!converted){ // Wait
converted = (Boolean) request.getSession().getAttribute("converterthread");
}
当线程结束他的工作时,它将会话的converterthread 属性设置为true。这一切都很好,但恐怕这不是最好的解决方案,每次都要求会话对服务器的性能不利吗?我正在尝试使用 this.wait(1000) 使我的函数检查线程是否每秒都结束,但我只是得到一个监视器未找到异常(或类似)。
编辑:在不同的请求方法中(在上一个方法之前称为方式),我正在创建一个使用 xuggler 类进行转换的线程(这样用户就不会等待所有转换结束)。基本上我创建了一个新的 MyThread(Runnable 的扩展),然后我将会话的“converterthread”属性设置为 false
MyThread r = new MyThread(uploadedFile, fileDir, request.getSession());
request.getSession().setAttribute("converterthread", false);
过了一会儿,我用 MyThread 创建了一个线程并启动它。这是 MyThread 的样子:
public class MyThread implements Runnable {
File uploadedFile;
File fileDir;
HttpSession session;
boolean hasEnded = false;
public MyThread(File f, File d, HttpSession s) {
fileDir = d;
uploadedFile = f;
session = s;
}
public File returnFileDir()
{
return fileDir;
}
@Override
public void run() {
new Converter(uploadedFile.getAbsolutePath(), fileDir.getPath() + "\\video").run();
//subito dopo voglio eliminare il file precedente
uploadedFile.delete(); // è sicuro che termina per ultima la conversione
//Aggiorno lo stato della sessione, sblocca il CutSave se aspettava la conversione
session.setAttribute("converterthread", true);
hasEnded = true;
MyThreadQueue.get().removeThread(this);
MyThreadQueue.get().runNextThread(); // se c'è un altro thread in attesa allora lo esegue
//Il meccanismo garantisce un esecuzione dei thread in fila
}
}
如您所见,转换后我调用 session.setAttribute("converterthread", true);