我有一个控制器,它有一个视图实例(一个javafx应用程序,但不应该扮演这个问题的角色),并且有一个公共方法String processInput(String input)
从一个按钮事件中调用视图和控制器将返回的String放在其视图的文本字段中。
processInput(String in)
方法在新线程上创建一个新的可运行StringService(String in)
实例,该实例在其run()
方法中执行“模型逻辑”。
目前,Controller必须等到StringService()
线程已经死亡,直到它通过StringService.getResult()
从服务中检索结果。
public class Controller
{
private final View view;
/*..*/
public void processInput(final String in)
{
StringService service = new StringService(in);
Thread task = new Thread(service);
task.start();
task.join(); // in a try-catch
/* Controller is now waiting... */
view.setDisplay(service.getResult());
}
}
如果Controller不需要等待Service
直到它可以再次响应,那将是很好的。因此,只要Service
线程完成,Controller就会获得结果,但同时它可以执行其他操作。
我想过让Controller也可以运行,它无限期地运行,并定期检查视图中是否有新输入或Service
已完成。控制器必须Queue
s,一个用于输入,一个用于Service
s的结果,这些结果会定期检查。例如:
public class Controller implements Runnable
{
/*...*/
private final int numProcesses = 10;
private ExecutorService executor = Executors.newFixedThreadPool(numProcesses );
private LinkedBlockingQueue<String> inputQueue = new LinkedBlockingQueue<>(numProcesses );
private LinkedBlockingQueue<String> outputQueue = new LinkedBlockingQueue<>(numProcesses);
public void run()
{
while(true)
{
checkInputQueue(); // creates new StringService threads
checkOutputQueue(); // returns something to view if non-empty
}
}
}
感谢您的帮助!