比如在主类中有2个线程,
thread1 a = new thread1();//做动画1
thread2 b = new thread2();//做动画2
a.start();
b.start();
问题是:点击按钮怎样使线程暂停或杀掉,且杀掉线程时,画图清空?
热烈欢迎大家帮助和讨论!
谢...!
问题点数:50、回复次数:11
Top
1 楼LiaoM()回复于 2002-06-08 02:24:59 得分 0 wait(),sleep(),destory()
Top
2 楼Philson(触发状态)回复于 2002-06-08 10:06:20 得分 10在run()中设置一个循环条件,用另一个thread来控制这个条件。
Top
3 楼dd777(grass)回复于 2002-06-08 10:43:45 得分 0 **********
怎样暂停呢?
再唤醒呢 ?
**********
Top
4 楼bhr(追风)回复于 2002-06-08 11:44:15 得分 5http://java./products/jdk/1.2/docs/guide/misc/threadPrimitiveDeprecation.html
Top
5 楼chfhxy(门外汉)回复于 2002-06-08 14:39:55 得分 0 尽量不要用destory(),因为线程可能占用资源而得不到释放
Top
6 楼liujuntao_1(流浪汉)回复于 2002-06-08 15:26:20 得分 5如果你让一个线程停止,只能让另一个唤醒它!
Top
7 楼dd777(grass)回复于 2002-06-08 23:08:52 得分 0 能具体些吗?
小举个例子。
比如在主类中有2个线程,
thread1 a = new thread1();//做动画1
thread2 b = new thread2();//做动画2
a.start();
b.start();
问题是:点击按钮怎样使线程暂停或杀掉,且杀掉线程时,画图清空?
Top
8 楼killjoy(伪装者)回复于 2002-06-09 01:12:48 得分 10public run() {
while(this.getName="线程A的名字") {
while (keepbusy) {
//如果Keepbusy=true,那么Thread A一直等待
}
}
对于你要暂停的话,你必须要先启动一个线程,让一个线程先进入临界区,然后让另一个线程wait,当第一个线程出临界区时发出notify(),这样等待进入临界区的线程就会自动被运行。
Top
9 楼dd777(grass)回复于 2002-06-09 19:20:58 得分 0 let me try!
come on all experts,how kinds you are!
Top
10 楼GJA106(中文字符)回复于 2002-06-10 14:02:57 得分 10public thread1 extends Thread
{
private boolean isRunning ;
thread1()
{
isRunning = true;
}
public void run()
{
while(isRunning)//外类中控制isRunning,决定线程的运行
{
//显示动画
}
//结束线程
}
}
Top
11 楼zqq_ttt()回复于 2002-06-10 15:40:30 得分 10Thread control;
public void action(Event e ,Graphics g)
//your button click event;
{ if(e.targert=="your button")
if(control.corrent==a)
a=null;//kill "a" thread;
g.SetbackColor(Color.white);
repaint();
}
g.SetbackColor(Color.white);这个方法可能不对,总之你要对画布进行一下操作,然后repaint一下。
a=null;是直接将线程置为空,相当于杀死线程。
如果不想杀死,或以后要用,可用a.suspend();不过如果这样的线程多了,系统资源会被大量占用,导致死机,这也是现在不提倡用得原因。在你用了这个方法以后,要人为的激发他。a.resume();
CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
搜索 收藏 打印 关闭 CSDN社区 > Java > J2SE / 基础类
线程问题,高手指点:怎样暂停,继续线程楼主whee(笨笨丸)2002-05-26 16:36:20 在 Java / J2SE / 基础类 提问
线程应该怎样暂停?在RUN()中用一个WHILE(TRUE)循环执行一段命令,把TRUE改成FALSE后线程停止了,线程也消亡了,那如何暂停后继续执行线程呢?
我想用WAIT(),和notify()控制,不过老是出错,不知道怎么用,有没有谁贴一段代码啊?
问题点数:20、回复次数:5
Top
1 楼freelybird(阿愚)回复于 2002-05-26 16:50:32 得分 51 wait() 与 notify() 是Object中的函数,可以用它去实现
2 至于暂停与继续是:suspend() resumethread(..)
Top
2 楼whee(笨笨丸)回复于 2002-05-26 16:56:31 得分 0 suspend 在JAVA2不是不能用了吗?
能帮我示范一下wait() notify()的用法吗?
Top
3 楼illia(蓝雪)回复于 2002-05-26 17:17:34 得分 5suspend()和resume()是挂起和恢复,java2中可以用
跟等待是不是相同概念
Thread thread=new Thread();
thread.wait();
thread.notify();
Top
4 楼forulong(龙行天下)回复于 2002-05-26 17:25:20 得分 10给个例子给你:自己换一些行;是关于银行存取款的。让
saver线程和spender线程同步。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class Console
{
public static String title(Object o)
{
String t=o.getClass().toString();
if(t.indexOf("class") !=-1)
t=t.substring(6);
return t;
}
public static void setupClosing(JFrame frame){
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e{
System.exit(0);
}
});
}
public static void run(JApplet applet, int width, int height){
JFrame frame=new JFrame(title(applet));
setupClosing(frame);
frame.getContentPane().add(applet);
frame.setSize(width,height);
applet.init();
applet.start();
frame.setVisible(true);
}
}
public class Banking extends JApplet
{
private static double balance=1000;
private JButton start=new JButton("start");
private boolean started=false;
private static JTextField curBalance=new JTextField("1000",10);
private static double saveBal=100;
private static double spenBal=9;
private static boolean runFlag=false;
private BankAccount bk;
private static boolean canget=true;
class BankAccount extends Thread
{
private JLabel lsv=new JLabel("money2 save/time"),
lsp=new JLabel("money2 spen/time");
private JTextField tsv=new JTextField("100",10),
tsp=new JTextField("9",10);
private Saver t=new Saver();
private Spender s=new Spender();
Object m=new Object();
public BankAccount()
{
JPanel p=new JPanel();
tsv.addActionListener(new SaveL());
tsp.addActionListener(new SpenL());
p.add(lsv);
p.add(tsv);
p.add(lsp);
p.add(tsp);
getContentPane().add(p);
}
public void start()
{
if(!started)
{
started=true;
super.start();
t.start();
s.start();
}
}
public synchronized void run()
{
while(true)
{
curBalance.setText(Double.toString(balance));
try {sleep(100);}
catch(InterruptedException e){System.err.println("INTERRUPTED");}
}
}
class Saver extends Thread
{
public Saver(){}
public void run()
{
while(true)
{
synchronized(m)
{
balance+=saveBal;
try{ sleep(1000);}catch(InterruptedException e){}
if(balance>spenBal)
{
canget=true;
m.notify();
}
}
}
}
}
class Spender extends Thread
{
public Spender(){}
public void run()
{
while(true)
{
synchronized(m)
{
if((balance-spenBal)<0)
try{m.wait();}catch(InterruptedException e){}
balance-=spenBal;
try{sleep(500);}catch(InterruptedException e){}
}
}
}
}
class SaveL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
saveBal=Double.parseDouble(tsv.getText());
}
}
class SpenL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
spenBal=Double.parseDouble(tsp.getText());
}
}
}
class StartL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
bk.start();
}
}
public void init()
{
Container cp=getContentPane();
cp.setLayout(new FlowLayout());
bk=new BankAccount();
JPanel p=new JPanel();
start.addActionListener(new StartL());
p.add(start);
p.add(curBalance);
cp.add(p);
}
public static void main(String [] args)
{
Banking applet=new Banking();
Console.run(applet,500,150);
}
}
Top
5 楼fightboy(眼泪哗哗的)回复于 2002-05-26 17:28:12 得分 0 当然安全的做法就是使用wait和notifyAll。
你为什么要中断和继续线程呢?
需要一个理由,
而这个理由就是wait的东西,以及nitifyAll的时机
Top
6 楼fightboy(眼泪哗哗的)回复于 2002-05-26 17:34:08 得分 0 不赞成使用suspend()和resume()的原因就是为了安全性。
就用wait和nofityAll 或者notify代替
实际上你让一个线程等待和唤醒他,都是有一定的原因的。
或者是为了同步,或者是为了异步
而这个条件满足时候,就正好调用wait
唤醒的时候就调用notifyAll
感觉非常自然。