android终止无限循环线程和程序退出时销毁线程

本文讨论了在Android中如何终止一个无限循环的子线程。提供了两种解决方案:一种是通过修改线程内部的循环标志来停止线程;另一种是使用`interrupt()`方法,但需要注意调用的时机。此外,还提到了Android程序退出后子线程可能继续运行的问题,并提出了两种可能的解决方案:一是改变循环标识符,二是利用Handler机制。文章最后提醒开发者要关注线程管理,避免后台线程无控制运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android,启动了一个子线程,这个子线程是一个死循环,不成的打印“Hello”

现在要实现点击一个Button,让这个子线程终止,用什么方法啊?

stop()不起作用,destroy()有异常,Handler貌似也解决不了,因为是一个线程。。。

 

答案如下:

线程像这样:Thread{    boolean flag = fase;    run(){        while(!flag){        }    }}Thread t = new Thread();t.start();-----------------------------------------------------要终止循环,只需要这样t.flag=true;================================================还有一种方式 线程像这样:Thread{    run(){        while(true){               Thread.sleep(xxxx);        }    }}Thread t = new Thread();t.start();--------------------------------------------要终止循环,只需要这样t.interrupte();但是这里要注意调用的时机,要在子线程执行了run方法里面的sleepxxxx)后xxxx时间之内调用。也就是子线程会睡一会,醒一会,睡一会,醒一会,要在子线程睡着的时候调用。


 

 

 

一个关于Android程序退出后,线程停止的问题

http://www.iteye.com/problems/67052

经过测试:以下方法可以终止线程。

方法一:System.exit(0);

方法二:android.os.Process.killProcess(android.os.Process.myPid())//关闭时稍微有些延迟





0

一个关于Android程序退出后,线程停止的问题10

Android的程序中,UI线程是主线程 

理论上来讲,Activity调用了finish方法后,主线程就终止了 

那么其上的子线程也应该是停止 


但是通过测试,发现并不是这样 

finish退出程序后,子线程还在后台跑 

必须用DDMS停止该线程才行 


那么如何在程序退出时,停止所有开启的子线程呢? 

我想到了两个方案: 


一,在退出时,改变线程内循环的标识符 

while(isRun){...} 

isRun置为false,则打破了循环,线程终止 


二,不采用while(isRun){...}这样的循环方式 

而利用Android提供的Handler机制来完成 

Java代码  icon_star.png

  1. //将一个线程立即加入线程队列,并执行它的[color=red]run[/color]方法  
  2. handler.post(test);  
  3.   
  4. Runnable test = new Runnable(){  
  5.   public void run(){  
  6.     //以上代码略  
  7.     //延迟1000毫秒,执行这个线程的[color=red]run[/color]方法  
  8.     handler.postDelayed(test,1000);  
  9.   }  
  10. }  
  11.   
  12. //退出时  
  13. //即从线程队列中移除该线程,不再被执行  
  14. handler.removeCallbacks(test);  


如红字标注,确实是调用的run方法,所以其实并未真正的启动一个子线程 


以上是我想到的两个方案,不知对不对 

请大家来探讨一下

问题补充

原来我的理解不对 

楼上兄台能否指点一二 

在下感激不尽

问题补充

原来如此 

谢谢指教



由于在Androidapk包对应的是一个组件,你退出MainActivity,并不代码这个组件运行的进程被杀。这里建议,加强对线程的管理,不要放任线程在后台跑,而不知道他的状态。参考 http://developer.android.com/guide/components/processes-and-threads.html,里

 AsyncTask


### 线程销毁的机制与最佳实践 #### 一、线程销毁的核心概念 线程销毁通常是指停止线程的运行并释放其占用的资源。在Java或其他编程语言中,线程的生命周期由操作系统管理,开发者可以通过特定的方法干预这一过程。然而,强制终止线程可能会引发不可预测的行为,因此推荐使用优雅的方式来实现线程的安全退出。 1. **线程阻塞与核心线程保持存活** 在线程池中,核心线程不会因为任务队列为空而立即被销毁,这是因为它们会进入一种阻塞状态[^1]。这种阻塞通常是通过`wait()`或类似的同步机制实现的,直到有新的任务到来唤醒这些线程。这种方式确保了核心线程能够持续存在而不消耗过多CPU资源。 2. **线程run方法执行完毕并不意味着线程销毁** 当线程的`run()`方法执行完成后,如果该线程属于线程池中的核心线程,则它并不会立刻销毁,而是继续等待新任务的到来[^1]。只有当线程是非核心线程且超出了最大空闲,才会被实际销毁。 3. **允许核心线程限** 设置`allowCoreThreadTimeOut(true)`后,即使对于核心线程,也可以在其闲置超过指定限后将其销毁。这提供了一种灵活调整线程池大小的能力,特别是在低负载情况下减少不必要的资源开销。 #### 二、线程销毁的具体方法 以下是几种常见的线程销毁方式: 1. **通过标志位控制线程退出** 使用布尔型变量作为循环条件的一部分,可以在外部修改此变量从而通知线程安全地退出。这种方法适用于长间运行的任务,并能有效避免因强制中断带来的异常行为[^3]。 ```java volatile boolean running = true; Thread worker = new Thread(() -> { while (running) { try { // 执行任务逻辑... Thread.sleep(100); } catch (InterruptedException e) { break; } } }); worker.start(); ``` 2. **利用`interrupt()`方法请求中断** Java提供了内置的支持用于处理线程中断的情况。调用目标线程的`interrupt()`函数可以设置其中断标记,随后在线程内部检测到这个信号即可采取相应措施完成清理工作并退出[^4]。 ```java thread.interrupt(); if (thread.isInterrupted()) { System.out.println("The thread has been interrupted."); } ``` 3. **结合`join()`回收已结束线程** 如果某些场景下需要确认某个子线程已经完全终止才能继续后续流程,则可以考虑采用`join()`方法让当前线程暂停直至所关联的目标线程彻底关闭为止[^2]。 ```java try { childThread.join(); } catch (InterruptedException ex) {} ``` 4. **移除未被执行的任务回调** 对于基于事件驱动模型的应用程序来说,像Android环境下的Handler对象一样,及清除那些尚未触发的动作也是防止内存泄漏的重要手段之一[^4]。 ```java handler.removeCallbacks(runnableTask); ``` #### 三、注意事项 尽管以上列举了几种有效的线程销毁策略,但在实际开发过程中仍需注意以下几点事项: - 避免直接杀死正在工作的线程; - 始终记得释放任何可能持有的锁或者共享数据结构; - 处理好可能出现的各种异常状况以保障系统的稳定性; --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值