2016-12-09 10 views
-3

Я начал нить на нажатие кнопки переключения. Теперь я хочу, чтобы этот поток снова нажал эту кнопку переключения. Но API Thread.stop() устарел. Итак, я получаю UnsupportedOperationException. Я не знаю, как использовать TimerTask в качестве альтернативы этому. Вот мой пример кода:Thread.stop() устарел. Но как использовать TimerTask?

//AudioDispatcher implements a Runnable 
public class AudioDispatcher implements Runnable 

//This is a code to start a thread 
AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0); 
Thread t1 = new Thread(dispatcher,"Audio Dispatcher"); 
t1.start(); 
+0

https://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Eric

+0

Возможный дубликат [Как использовать TimerTask для запуска потока?] (Http: // stackoverflow.com/questions/10029831/how-do-you-use-a-timertask-to-run-a-thread) –

ответ

2

Вы не можете просто остановить поток в середине исполнения. Если вы хотите остановить поток в середине исполнения, вы можете вызвать метод Thread.interrupt().

public class SomeBackgroundProcess implements Runnable { 

Thread backgroundThread; 

public void start() { 
    if(backgroundThread == null) { 
     backgroundThread = new Thread(this); 
     backgroundThread.start(); 
    } 
} 

public void stop() { 
    if(backgroundThread != null) { 
     backgroundThread.interrupt(); 
    } 
} 

public void run() { 
    try { 
     Log.i("Thread starting."); 
     while(!backgroundThread.interrupted()) { 
      doSomething(); 
     } 
     Log.i("Thread stopping."); 
    } catch(InterruptedException ex) { 
     // important you respond to the InterruptedException and stop processing 
     // when its thrown! Notice this is outside the while loop. 
     Log.i("Thread shutting down as it was requested to stop."); 
    } finally { 
     backgroundThread = null; 
    } 
} 
0

Вы можете попробовать следующее задание задачи;

private static final int DEFAULT_DELAY_TIME = 1000; 
private static final int DEFAULT_PERIOD = 1000; 
private Timer mPlayTimer; 
private TimeTask mPlayPlanTask; 

private void startTask() { 
     configTimer(); 
     mPlayTimer.schedule(mPlayPlanTask, DEFAULT_DELAY_TIME, 
       DEFAULT_PERIOD); 
    } 
} 

private void stopTimer() { 
    if (mPlayTimer != null) { 
     mPlayTimer.cancel(); 
     mPlayTimer = null; 
    } 
    if (null != mPlayPlanTask) { 
     mPlayPlanTask.cancel(); 
     mPlayPlanTask = null; 
    } 
} 

private void configTimer() { 
    if (null == mPlayTimer) { 
     mPlayTimer = new Timer(); 
    } 
    if (null == mPlayPlanTask) { 
     mPlayPlanTask = new TimerTask() { 
      @Override 
      public void run() { 
        // Do some work; 
      } 
     }; 
    } 
} 
0

Создание флага и остановки в соответствии с флагом

class Server implements Runnable{ 
     private volatile boolean exit = false; 

     public void run() { 

    while(!exit){ 
     System.out.println("Server is running....."); 
    } 

    System.out.println("Server is stopped...."); 
    } 

    public void stop(){ exit = true; } 
} 

запуск и остановка Теперь

Server myServer = new Server(); 
    Thread t1 = new Thread(myServer, "T1"); 
    t1.start(); 
//Now, let's stop our Server thread 
System.out.println(currentThread().getName() + " is stopping Server thread"); myServer.stop(); 
0

Вы не можете остановить запускаемым по вашей собственной личности или не может остановить поток можно прервать ваш поток, позвонив Thread.interrupt(). Расширьте свой AudioDispatcher до Thread, а не Runnable переопределить interrupt(), если вам нужно освободить некоторые ресурсы.

public class AudioDispatcher extends Thread { 

    @Override 
    public void run() { 
     // check if thread is interrupted do nothing 
     if(!Thread.currentThread().isInterrupted()){ 

     } 
    } 

    @Override 
    public void interrupt() { 
     super.interrupt(); 
     // release resources if any 
    } 
} 

Теперь начните нить на

AudioDispatcher audioDispatcherThread = new AudioDispatcher(); 
audioDispatcherThread.start(); 

Когда вам нужно остановить нить вызов audioDispatcherThread.interrupt();