问题描述
|
我有一堆复选框和单选按钮,它们允许用户过滤ѭ0中的项目。每个事件都需要进行线程处理以避免GUI冻结。
我想做的是将事件排入队列,并按接收到的顺序对其进行操作。
目前,我有以下设计,但我认为必须有更好的方法。基本上,对于每个潜在的排队方法,我都有一个映射到它的整数。该整数值会在每次“ 1”方法执行整数时加到列表中,这些整数会循环遍历并转换为函数调用。
我可能正在考虑使用EventQueue对其进行调用。这种功能的最佳模式或技术是什么?
Vector<Integer> taskQueue;
/**
* Adds tasks to a queue things are completed in the order they were added. This allows for
* threading and concurrency issues.One task is done at a time.
* @param
*/
private void doTasks()
{
if(!queueIsRunning)
{
doTasks = new Thread(){
public void run()
{
queueIsRunning = true;
while(!taskQueue.isEmpty())
{
intVal = taskQueue.get(0);
taskQueue.remove(0);
switch(intVal)
{
case DOM_HIGHLIGH_TASK:
System.out.println(\"starting dom highlight\");
highlightDom();
break;
case FLASH_HIGHLIGH_TASK:
System.out.println(\"starting flash highlight\");
higlightFlash();
break;
case SQL_HIGHLIGH_TASK:
System.out.println(\"starting sql highlight\");
highlightSQL();
break;
case INFO_HIGHLIGH_TASK:
System.out.println(\"starting infoleak highlight\");
highlightInfoLeak();
break;
case HTMLCOM_HIGHLIGH_TASK:
System.out.println(\"starting htmlcomm highlight\");
highlightHtmlComments();
break;
case SORT_EXTENSIONS:
sortExtensions();
}
}
queueIsRunning = false;
}
};
doTasks.start();
}
}
解决方法
Event Dispatch Thread (EDT)
有自己的队列
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
//do stuff
}
});
为什么那还不够?如果这些是长期运行的任务(很难想象),我将签出SwingWorker。
, 如果您要使用该模式,请使用其他答案提到的事件分发,也可以使用Java 5以后的ѭ5。然后,您可以使用take()
方法,该方法将阻塞直到命令队列中包含元素。