android 中,关于线程安全退出的问题(from stack overflow)
2012-06-10 10:56
225 查看
原贴地址:http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class
62down voteaccepted | There are several problems in the code sample you posted I will address in order: 1) Thread.stop() has been deprecated for quite some time now, as it can leave dependent variables in inconsistent states in some circumstances. See this Sun answer page for more details. A preferred method of stopping and starting a thread is as follows: private volatile Thread runner; public synchronized void startThread(){ if(runner == null){ runner = new Thread(this); runner.start(); } } public synchronized void stopThread(){ if(runner != null){ Thread moribund = runner; runner = null; moribund.interrupt(); } } public void run(){ while(Thread.currentThread() == runner){ //do stuff which can be interrupted if necessary } } 2) Your measurements list is accessed by multiple threads (the event thread and your user thread) at the same time without any synchronization. It looks like you don't have to roll your own synchronization, you can use a BlockingQueue. 3) You are creating a new Socket every iteration of your sending Thread. This is a rather heavyweight operation, and only really make sense if you expect measurements to be extremely infrequent (say one an hour or less). Either you want a persistent socket that is not recreated every loop of the thread, or you want a one shot runnable you can 'fire and forget' which creates a socket, sends all relevant data, and finishes. (A quick note about using a persistent Socket, socket methods which block, such as reading, cannot be interrupted by Thread.interrupt(), and so when you want to stop the thread, you must close the socket as well as calling interrupt) 4) There is little point in throwing your own exceptions from within a Thread unless you expect to catch it somewhere else. A better solution is to log the error and if it is irrecoverable, stop the thread. A thread can stop itself with code like (in the same context as above): public void run(){ while(Thread.currentThread() == runner){ //do stuff which can be interrupted if necessary if(/*fatal error*/){ stopThread(); return; //optional in this case since the loop will exit anyways } } } Finally, if you want to be sure a thread exits with the rest of your application, no matter what, a good technique is to call Thread.setDaemon(true) after creation and before you start the thread. This flags the thread as a daemon thread, meaning the VM will ensure that it is automatically destroyed if there are no non-daemon threads running (such as if your app quits). Obeying best practices with regards to Threads should ensure that your app doesn't hang or slow down the phone, though they can be quite complex :) |
相关文章推荐
- 关于tabview cell中的事件无法传递到next response 的问题(from stackoverflow)
- 关于程序退出无法关闭所有界面问题 通过广播使Android程序完全退出
- 【Android学习】关于Android4.4沉浸模式的进入和退出时系统栏状态栏遮盖问题
- 关于Android开发中使用System.exit(0)的问题(如写返回键响应时用到双击退出函数的时候)
- 关于android应用程序使用ActivityManager退出的问题
- 关于Android ActionBar 一直显示overflow的一些问题
- 关于android 多个Activity应用程序按返回键退出程序问题
- 关于Android退出程序的问题(在主页面或任意页面退出App)
- 关于Android程序退出后内存释放的问题
- 关于android应用退出的问题
- 关于Android程序退出后内存释放的问题
- android--------关于ActionBar的Overflow问题
- 关于android应用退出的问题
- 关于android应用退出的问题
- Android关于——com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536——问题
- Android 关于极光推送退出APP时清空通知的问题
- Android关于buildToolVersion与CompileSdkVersion的区别 点击打开链接StackOverFlow中对这个问题进行了详细的讨论:http://stackoverfl
- android关于 LayoutInflater.from(context)中参数的问题
- 关于android 多个Activity应用程序按返回键退出程序问题
- 关于Android点击物理返回键退出程序的问题