我正在开发一个使用Java swing和Matlab的项目。我有一个带2个按钮的GUI" Run"和"暂停"。我正在使用一个java程序(Matlabjavaprog.java),我正在运行一个循环,如下所示:
int pause = 0;
for (int i=0; i<10; i++) {
if (pause == 20000) {
try {
Thread.sleep(pause);
System.out.println("Now delayed for 20s!");
} catch (InterruptedException ie) {}
} else {
proxy.setVariable("n", i);
proxy.eval("n=n+1");
proxy.feval("myfun");
}
}
当我按下&#34; Run&#34;按钮,else部分执行。但我想按&#34; Pause&#34;在这个循环之间的按钮,其中暂停值(20000)将从GUI传递给java程序,执行应该延迟20000ms。但是,我无法按&#34;暂停&#34;按钮直到&#34;运行&#34;正在执行循环。
&#34;运行&#34;按钮:
JButton btnNewButton = new JButton("Run");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pauseButton.setEnabled(true);
prog1.main(args); // a java program that calls another program Matlabjavaprog.java (which calls an instance of Matlab)
}
});
&#34;暂停&#34;按钮:
pauseButton = new JButton("Pause");
pauseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int p =20000;
Matlabjavaprog.getpause(p); // a function in Matlabjavaprog java program that passes pause value from GUI to this program
}
});
实际上&#34;运行&#34;使用MATLAB创建TCP连接,并在其中运行多个数据集实例。整个过程不能放入线程,因为它不允许重新连接,因为它已经连接。似乎一旦我按下&#34; Run&#34;,我就不能按&#34;暂停&#34;直到运行完成。有没有办法执行&#34;暂停&#34;根据用户需要可以延迟循环的按钮?目前,我无法向正在运行的程序发送暂停值,即Matlabjavaprog.java。任何帮助都会很明显!
答案 0 :(得分:0)
如何通过实施Runnable并使用AtomicBoolean
将执行放在另一个线程中e.g。
AtomicBoolean isPaused = new AtomicBoolean(false);
new Thread(new Runnable(){
public void run(){
while(true){
if(isPaused.get()){
Thread.sleep(20000);
isPaused.set(false);
}
proxy.setVariable("n", i);
proxy.eval("n=n+1");
proxy.feval("myfun");
}
}
}).start()
然后在你的暂停按钮中,调用一个调用isPause.set(true)的setter,这应该使它可以点击。无论如何,这是一个开始 - 为了简单起见,我喜欢使用原子来在线程之间进行信号传递。