java - MVC设计:旋转服务线程的控制器

时间:2017-11-28 13:20:41

标签: java multithreading model-view-controller

我有一个控制器,它有一个视图实例(一个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
        }
    }
}

感谢您的帮助!

0 个答案:

没有答案