当前位置: 代码迷 >> J2SE >> 线程中wait跟notify的一个小例子
  详细解决方案

线程中wait跟notify的一个小例子

热度:7511   发布时间:2013-02-25 00:00:00.0
线程中wait和notify的一个小例子
今天看了一个关于sleep的面试题,然后自己想了一个关于wait的 具体实现是这样的
有三个buton 分别是hello stop wake 实现的功能是 当点击hello就在控制台输出一个hello 然后点击stop 输出hello就wait指导再点击wake然后中间点了几次hello就一下输出几个hello下面是我写的 但是写不对,线程这东西好久不用都忘了,希望各位指点一下。
Java code
import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;public class WaitNotifyTest extends JFrame {    private JButton sayHello;    private JButton stop;    private JButton wake;    private boolean flag;    public static void main(String[] args) {        new WaitNotifyTest().launch();    }    public void launch() {        sayHello = new JButton("hello");        stop = new JButton("stop");        wake = new JButton("wake");        flag = true;        add(sayHello);        add(stop);        add(wake);        sayHello.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {                while (flag == false) {                    synchronized (this) {                        try {                            this.wait();                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }                System.out.println("hello");            }        });        stop.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {                flag = false;            }        });        wake.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {                synchronized (this) {                    flag = true;                    this.notify();                }            }        });        this.setLayout(new FlowLayout());        this.pack();        this.setVisible(true);    }}


------解决方案--------------------------------------------------------
一个线程里,一旦进入wait(),线程进入阻塞,谁能唤醒?
修改了一下,楼主参考:
Java code
import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;public class WaitNotifyTest extends JFrame {    private JButton sayHello;    private JButton stop;    private JButton wake;    private boolean flag;    static Object ob=new Object();                    //用于做同步对象锁。    public static void main(String[] args) {        new WaitNotifyTest().launch();    }    public void launch() {        sayHello = new JButton("hello");        stop = new JButton("stop");        wake = new JButton("wake");        flag = true;        add(sayHello);        add(stop);        add(wake);        sayHello.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {        new Thread(new Runnable(){                //内部类再创建并启动一个线程        public void run(){                while (flag == false) {                    synchronized (WaitNotifyTest.ob) {                        try {                            WaitNotifyTest.ob.wait();            //不用this了.             } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }                System.out.println("hello");            }            }).start();        }        });        stop.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {                flag = false;            }        });        wake.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent arg0) {                synchronized (WaitNotifyTest.ob) {        //这的同步对象也变了。                    flag = true;                    WaitNotifyTest.ob.notify();                }            }        });        this.setLayout(new FlowLayout());        this.pack();        this.setVisible(true);    }}
  相关解决方案