wait()和notify()以及一个ActionListener

时间:2015-09-14 18:12:31

标签: java multithreading

我有一个图形界面,可以使用两个线程,每个线程都必须在各自的文本区域中打印一个计数器。第二个线程(名为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);
    }

}

1 个答案:

答案 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。我知道这不仅仅是一个评论而是一个答案,但发布评论太多了