我正在使用具有服务类的Android应用程序。我服务类,我必须开始一个线程。它工作正常。但我需要停止线程。我用过
mThread.destroy();
mThread.stop();
但两者都已弃用,我使用了
mThread.interrupt();
但它仍然不起作用。
码
public void Receivepatientattributes(byte[] readBuf, int len) {
if (readBuf[8] == 6){
pktcount++;
byte pkmsb = readBuf[11];
byte pklsb = readBuf[10];
int pkresult = (pkmsb << 8) | ((int)pklsb & (0x00FF));
System.out.println("Packet : "+pktcount+" : "+pkresult);
if(pkresult == pktcount){
for(int i = 0, j = 14; i < len ; i++, j++) {
queue.add(readBuf[j]);
}
if(mThread.getState() == Thread.State.NEW) {
mThread.start();
System.out.println("Start Thread ");
} else {
System.out.println("No Thread Found");
}
} else {
displayToast("Packet Count Error");
}
}
}
}
class CommunicationThread implements Runnable {
@Override
public void run() {
do{
if(queue.getFirst() == (byte)0x80) {
System.out.println("absolu1 " + queue.getFirst());
getabs_data();
}
} while (queue.size() > 132);
if(mThread.getState() == Thread.State.RUNNABLE) {
mThread.interrupt();
}
}
}
答案 0 :(得分:0)
尝试
if(mThread.isInterrupted()){
break;
}
在你的循环中。
答案 1 :(得分:0)
Java没有提供任何方法来安全地停止线程,它只提供中断
您可以向线程发送拦截,但这并不意味着杀死线程。 只有当目标线程能够响应此拦截时,它才能自行停止。
例如,目标有一个循环来检查它是否被中断。或者,如果目标线程调用某些可中断的阻塞函数,则可以检查catch块中的中断并停止该线程。
有关java并发的更多信息,请阅读书籍《Java Concurrency in Practice》
答案 2 :(得分:0)
线程对象由系统控制,系统可以在应用程序的进程之外修改它们。因此,您需要在中断之前锁定线程上的访问权限,方法是将访问权限放在同步块中。
ublic class PhotoManager {
public static void cancelAll() {
/*
* Creates an array of Runnables that's the same size as the
* thread pool work queue
*/
Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()];
// Populates the array with the Runnables in the queue
mDecodeWorkQueue.toArray(runnableArray);
// Stores the array length in order to iterate over the array
int len = runnableArray.length;
/*
* Iterates over the array of Runnables and interrupts each one's Thread.
*/
synchronized (sInstance) {
// Iterates over the array of tasks
for (int runnableIndex = 0; runnableIndex < len; runnableIndex++) {
// Gets the current thread
Thread thread = runnableArray[taskArrayIndex].mThread;
// if the Thread exists, post an interrupt to it
if (null != thread) {
thread.interrupt();
}
}
}
}
...
}
如需进一步参考,请使用此link。
答案 3 :(得分:0)
在CommunicationThread
中,有一个do ... while循环。通过将isInterrupted()
添加到循环条件中来略微编辑此循环:
do{
if(queue.getFirst() == (byte)0x80) {
System.out.println("absolu1 " + queue.getFirst());
getabs_data();
}
} while (mThread.isInterrupted() && queue.size() > 132);
答案 4 :(得分:0)
在android中使用Threads不是一个好主意。因为它不是线程安全的。相反,使用{s} s为此目的提供的AsyncTask。 仅供参考,要取消AsyncTask,您应该致电:
myAsyncTask.cancel(true);