2015-12-02 3 views
0

Я работаю над Android-приложением, имеющим класс обслуживания. Я обслуживаю класс, я должен начать поток. Он работает нормально. Но мне нужно остановить поток. Я использовал сAndroid: Stop Thread

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

http://www.ibm.com/developerworks/library/j-jtp05236/ хорошая статья WRT прерывания темы правильно. – zapl

ответ

0

Попробуйте с

внутри вашего цикла.

+0

«Попробуйте это» не очень полезно, потому что он не объясняет, что было не так, или как исправить это в другом случае. –

0

Java не предоставляет никаких способов, чтобы остановить поток безопасно, он только обеспечивает прерывания

Вы можете отправить перехваты в тему, , но это вовсе не значит, чтобы убить нить. Только в том случае, если целевой поток может реагировать на этот перехват, он может остановиться.

Например, у цели есть цикл, чтобы проверить, не прервано или нет. Или, если целевой поток вызывает некоторые прерывистые функции блокировки, вы можете проверить прерывание в вашем блоке catch и остановить этот поток.

Для получения дополнительной информации о Java параллелизм, читать книгу 《Java Concurrency in Practice》

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.

0

В CommunicationThread, есть ... цикл. Редактировать этот цикл немного, добавив isInterrupted() условию передачи контура в:

do{ 
     if(queue.getFirst() == (byte)0x80) { 
      System.out.println("absolu1 " + queue.getFirst()); 
      getabs_data(); 

     } 
    } while (mThread.isInterrupted() && queue.size() > 132); 
0

Это не очень хорошая идея использовать темы в андроид. Потому что это не Thread-safe. Вместо этого используйте AsyncTask, который был указан для этой цели. FYI, для отменив AsyncTask следует назвать:

myAsyncTask.cancel(true); 
+1

Не верно/упрощено. 'AsyncTask' сам по себе является не более чем хорошим способом использования простых старых' Thread'. Они предпочтительнее, когда вы реализуете шаблон, который они предназначались для: задач, отколовшихся от основного потока, которые должны сообщать об этом в основной поток. «AsyncTask» обеспечивает отличную абстракцию для обратного и заднего потоков между основными и фоновыми потоками.Они не добавляют никакой безопасности волшебной нити. – zapl