我有一个图形界面,可以使用两个线程,每个线程都必须在各自的文本区域中打印一个计数器。第二个线程(名为threadEvent)与ActionListener以及阻塞和取消阻塞线程的按钮一起使用。当用户按下按钮时,它会阻止threadEvent(它停止打印计数器),当再次按下该按钮时,它会解锁并继续在相应的textArea中打印。为此,我必须使用wait()来阻塞线程并使用notify()解除阻塞,我已经阅读了一些有关此内容的信息,但我不知道如何将它们与按钮一起使用
class T implements Runnable{
private boolean print = true;
private int i = 0;
private long pause;
private JTextArea textArea;
T(long miliseconds,JTextArea textAreax){
pause = miliseconds;
textArea = textAreax;
}
public void pressedButton()
{
if(print)
print = false;
else
print = true;
}
public void run()
{
while(print)
{
try
{
this.printCounter();
Thread.sleep(pause);
this.i++;
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public void printCounter(){
String time;
time = Integer.toString(i);
textArea.setText(time);
}
}
class Interface extends JFrame implements ActionListener{
private JTextArea textArea,textArea2;
private JButton button;
private T thread,threadEvent;
private Thread t,tE;
Interface()
{
textArea = new JTextArea(10,7);
textArea2 = new JTextArea(10,7);
thread = new T(2000,textArea);
threadEvent = new T(1000,textArea2);
button = new JButton("Block/Unblock");
this.getContentPane().add(button,BorderLayout.SOUTH);
this.getContentPane().add(textArea,BorderLayout.WEST);
this.getContentPane().add(textArea2,BorderLayout.EAST);
t = new Thread(thread);
tE = new Thread(threadEvent);
t.start();
tE.start();
button.addActionListener(this);
}
public void actionPerformed(ActionEvent event)
{
threadEvent.pressedButton();
}
}
public class MessageThreads{
public static void main(String[] args) {
Interface i = new Interface();
i.setBounds(200, 200, 300, 240);
i.setVisible(true);
}
}
答案 0 :(得分:3)
关于Swing和线程的说明:Swing is not thread-safe。您只能从事件派发线程更新Swing组件(例如textArea.setText(time);
)。
您可以使用SwingUtilities.invokeLater()
或SwingUtilities.invokeAndWait()
执行此操作。例如:
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run()
{ `textArea.setText(time); }
});
PS。我知道这不仅仅是一个评论而是一个答案,但发布评论太多了