Android:停止线程

时间:2015-12-02 10:43:43

标签: java android multithreading

我正在使用具有服务类的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();
        }
    }
}

5 个答案:

答案 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);