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

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

阅读更多

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

分享到:
评论

相关推荐

    易语言线程暂停与继续

    在编程领域,线程是操作系统分配CPU执行时间的基本单元,特别是在多任务环境下,线程管理是实现并发执行的关键。易语言作为一款中国本土的编程工具,提供了丰富的内建支持来处理线程操作,如创建、暂停、恢复和销毁...

    vc6.0Multi-Thread.zip_vc6 线程_多线程暂停_线程暂停_线程间 通信

    在本文中,我们将深入探讨如何在Microsoft Visual C++ 6.0(简称VC6.0)环境下进行多线程编程,特别关注线程的创建、暂停、停止以及线程间的通信。多线程编程是软件开发中的一个重要概念,它允许程序同时执行多个...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    本篇文章将深入探讨如何实现线程的协同、停止、暂停以及继续等操作,这些都是多线程编程中的核心概念。 1. **线程的协同(协作式线程调度)** 在Java中,线程的协同主要通过`wait()`和`notify()`或`notifyAll()`...

    暂停线程工具(附源码)

    在多线程环境下,有时候我们需要对线程进行控制,比如暂停或恢复某个线程的执行,以便进行调试、同步或其他操作。标题提到的“暂停线程工具”就是这样一个实用程序,它提供了暂停和恢复线程的功能,并且附带了源代码...

    多线程窗口暂停线程 并恢复

    本文将深入探讨如何在具有多个窗口的环境中使用线程来实现文字的同步显示,并掌握如何暂停和恢复线程,这对于理解和优化应用程序性能至关重要。 首先,让我们了解线程的基本概念。线程是程序执行的最小单位,每个...

    易语言利用Event事件实现多线程暂停继续源码

    通过合理利用易语言的Event事件,我们可以实现更复杂的应用逻辑,例如控制多线程的并发执行顺序,处理线程间的同步问题,以及在需要时暂停或恢复特定线程的工作。这种技术在多任务并行处理、实时系统和网络编程等...

    C#内存释放-线程控制-线程启动-线程暂停

    C#不提供直接的线程暂停API,但可以通过共享变量或信号量(如`ManualResetEvent`)来间接实现。 例如,一个线程可能在执行到特定点时检查一个共享标志,如果该标志指示应暂停,它就会进入等待状态。其他线程可以...

    python 线程的暂停, 恢复, 退出详解及实例

    需要注意的是,由于线程的暂停和恢复操作依赖于循环检测标志位,所以实际上存在一定的延迟,即线程不会立即响应暂停或恢复命令,而是会在当前循环迭代结束后才作出反应。对于需要即时响应的应用场景来说,这一点需要...

    retrofit实现多线程断点下载,可暂停,开始

    在Android开发中,为了提供更好的用户体验,我们常常需要实现文件的多线程断点下载功能。这不仅可以提高下载速度,还能允许用户在任何时候暂停或继续下载。本篇将重点讲解如何利用Retrofit库和GreenDao数据库来实现...

    C++ 线程暂停、继续

    这是因为线程暂停和恢复在多线程环境中可能导致死锁或其他难以预测的问题。不过,可以使用同步对象(如条件变量、事件对象或信号量)来实现类似的功能。 例如,可以使用`std::condition_variable`来暂停和唤醒线程...

    易语言多线程传递多参数

    但在多线程环境中,由于线程间的并发执行,直接传递可能会引发数据不一致的问题。易语言提供了一种安全的方式来传递参数,即通过“线程参数”数据结构。创建线程时,我们可以将需要传递的数据封装到线程参数中,确保...

    鱼刺多线程注册源码例子(鱼刺多线程稳定框架)

    "鱼刺框架"的稳定特性意味着它在设计时考虑了线程安全性和资源管理,确保在多线程环境下不会出现竞态条件、死锁或其他常见的并发问题。这些特性通常包括锁机制(如互斥量、读写锁)、信号量、条件变量等同步原语,...

    pb9多线程控件,能够真实实现多线程

    标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...

    Delphi多线程的安全问题分析及解决

    ### Delphi多线程的安全问题分析及解决 #### 摘要 本文深入探讨了Delphi环境下多线程运行过程中可能遇到的安全问题及其解决方案。在Windows操作系统中,多线程技术因其高效性和灵活性而被广泛应用于软件开发之中。...

    C#中利用多线程控制打印的暂停和继续

    在C#编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高效率和响应性。在处理耗时操作如打印时,多线程尤其有用,可以确保用户界面不会被阻塞,提供更好的用户体验。本文将深入探讨如何在C#...

    单线程与多线程的区别

    多线程也有其挑战,比如线程间的数据共享可能导致竞态条件、死锁等问题,需要使用锁或其他同步机制来避免。此外,线程创建、销毁和管理也消耗资源,过多的线程可能会导致系统性能下降。 在实际编程中,如何选择单...

    多线程框架通用多线程源码.zip

    这个压缩包中的"多线程5.e"文件很可能包含了一个完整的多线程创建和管理模块,可能包括了线程启动、暂停、恢复和销毁等操作的函数或过程。 线程的启动是多线程编程的第一步,通常涉及到一个入口函数,该函数定义了...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...

    PB多线程实现

    同时,需要处理线程同步问题,例如使用Mutex、Semaphore或Event对象来防止数据竞争和死锁。 二、PB12.5的多线程支持 PB12.5引入了对多线程的更好支持,它引入了一个名为“Worker Thread”的新概念。开发者可以创建...

    一个多线程示例程序及多线程常见问题介绍

    在这个主题中,我们将深入探讨一个多线程示例程序以及在使用多线程时可能遇到的常见问题。 首先,我们来看标题中提到的"一个多线程示例程序"。在C++Builder中,创建多线程通常涉及使用`TThread`类,这是VCL(Visual...

Global site tag (gtag.js) - Google Analytics