已有101人关注
Java第18章 多线程问题
发表在Java图书答疑 2016-06-04
是否精华
版块置顶:
请问老师有没有关于 Object类的 wait()  和 notify() 这两个方法的用法资料,书中并没有讲解如何使线程进入等待和唤醒。
分享到:
精彩评论 2
西瓜_mrkj
学分:0 LV1
2016-06-05
沙发
题目要求:开发一个窗体,窗体中有两个按钮,一个是“开始”按钮,一个是“结束”按钮。当用户单击“开始”按钮时,在控制台持续打印一段话;当用户单击“结束”按钮时,控制台结束打印。

先看了一下参考答案的实现原理,自己用下面的代码实现:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class MyThreadTest extends JFrame implements Runnable{
private static final long serialVersionUID = 1L;
Thread t=null;
public MyThreadTest() {
Container c=getContentPane();
JPanel p=new JPanel();
JButton b1=new JButton("开始");
JButton b2=new JButton("结束");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(t==null){
t=new Thread(MyThreadTest.this);
t.start();
}
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(t!=null){
t.interrupt();
t=null;
}
}
});
p.add(b1);
p.add(b2);
c.add(p);

setTitle("多线程练习");
setSize(200, 100);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}

public void run(){
while(true){
System.out.println("线程正在执行");
try{
Thread.sleep(500);
}
catch(Exception e){
System.out.println("打印结束");
break;
}
}
}

public static void main(String[] args) {
new MyThreadTest();
}

}

思考了一下,觉得总是创建和消亡线程不是我想要的,于是发帖提问怎么使用wait和notify方法,后来自己查阅资料后用下面的代码也成功实现了题目要求:

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class WaitAndNotify extends JFrame{
private static final long serialVersionUID = 1L;
private JPanel panel;
private JButton startButton;
private JButton stopButton;
private ThreadClass thread;
private WaitAndNotify() {
Container c=getContentPane();
thread=new ThreadClass();
new Thread(thread).start();
panel=new JPanel();
startButton=new JButton("开始");
stopButton=new JButton("停止");

startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
thread.start();
}
});
stopButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
thread.stop();
}
});

panel.add(startButton);
panel.add(stopButton);
c.add(panel);

setTitle("线程等待与唤醒");
setSize(250, 150);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new WaitAndNotify();
}
}

class ThreadClass implements Runnable{
private boolean isStart=false;
public void run(){
while(true){
synchronized (this) {
if(!isStart){
try {
wait();
} catch (Exception e) {

}
}
}
try {
Thread.sleep(500);
} catch (Exception e) {

}
if(isStart)
System.out.println("打印中...");
}
}
public synchronized void start(){
isStart=true;
System.out.println("线程开始执行");
notify();
}
public void stop(){
isStart=false;
System.out.println("线程停止执行");
}
}

第二种实现方式用到了wait和notify方法,实现了线程的挂起和唤醒,不需要频繁创建和消亡线程了。
菜鸟级精英
学分:0 LV1
TA的每日心情
开心
2020-03-23 21:05:48
2016-06-06
板凳
你后面写的这个例子就是java官网推荐的线程暂停、启动的例子,但注意,两个方法都要添加线程安全关键字

public [font color=#FF0000]synchronized [/font]void start(){
isStart=true;
System.out.println("线程开始执行");
notify();
}
public [font color=#FF0000]synchronized[/font]  void stop(){
isStart=false;
System.out.println("线程停止执行");
}
}
首页上一页 1 下一页尾页 2 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照