`
eyesye
  • 浏览: 19864 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

请教高手,线程问题,怎样暂停或杀掉多线程

阅读更多

 
比如在主类中有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.sun.com/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  
  感觉非常自然。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics