打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ddsdcx
Java内存模型中的同步和易失性如何工作?
Visual Studio的调试技巧
C# 多线程参数的使用
支持多线程的日志记录类实现
synchronized的作用 - 摆渡人,外婆桥! - BlogJava
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服