2012-08-08 43 views
0

在我的應用我有MainThread,我有一個SeperateThreadJava線程 - 需要注意的事項?

我幾乎工作到完美的線程。唯一的問題是我無法關閉SeperateThread

public void run() 
{ 
    isRunning = true; 
    while(isRunning) 
    { 
     Log.d(TAG, "Running..."); 
     long currentTime = SystemClock.uptimeMillis(); 
    } 
} 

public void StopThread() 
{ 
    isRunning = false; 
} 

seperateThread.StopThread(); 

然後在線程我有一個方法,只是關閉volatile boolean isRunning。儘管我在調試器中逐步指出線程將布爾值切換爲關閉。

  • 什麼會導致此類問題?
  • 這是關閉線程的最簡潔的方法嗎?
  • 任何其他關閉線程的步驟?
  • 他們在Android的多線程中遇到了什麼挫折?
+1

什麼是告訴你的是,SeparateThread仍在運行? – 2012-08-08 02:01:39

+0

LogCat - 我把日誌消息放在while – 2012-08-08 02:03:13

+0

是否有可能你的線程卡在循環中的某個地方? – Edmon 2012-08-08 02:13:02

回答

2

你一定想要使用新的併發包東西,並抓取Java Concurrency in Practice的副本,並瞭解更多信息。線程看似簡單。

爲什麼你的代碼不工作可能與你沒有設置isRunning錯誤的方式你期望。但是,無論如何,java.util.concurrency包都會爲您執行此操作。

在你的情況你應該看看Executor框架。所以,你的代碼可能是這個樣子:

ExecutorService exec = Executors.newFixedThreadPool(1);//A field somewhere 
    //Start your thread 
    exec.submit(new Runnable(){ 
     @Override 
     public void run() { 
      while (!exec.isShutdown()) { 
       Log.d(TAG, "Running..."); 
       //Do stuff 
      } 
     } 
    }); 
    //when done 
    exec.shutdown(); 

想着這一夜,這可能是一個更好的辦法:

ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); 
    exec.scheduleWithFixedDelay(new Runnable() { 
     @Override 
     public void run() { 
      //Do stuff 
     } 
    }, 0, 1, TimeUnit.MILLISECONDS); 
    //when done 
    exec.shutdown(); 
+0

謝謝我會研究這個!與使用java線程的優點相比有什麼缺點? – 2012-08-08 02:46:02

+0

Thread類的直接使用基本上是低級編程,應該避免。看到這裏:http://my.safaribooksonline.com/book/programming/java/9780137150021/concurrency/ch10lev1sec3 – Yishai 2012-08-08 03:50:37

+0

感謝您的編輯看起來很有趣的幫助,我絕對可以使用它。再次感謝! – 2012-08-08 14:42:20

0
isRunning = true; 
while(isRunning) 
{ 
    Log.d(TAG, "Running..."); 
    ...//Do something 
} 

你有沒有在你的while循環休息一下?還是你設置isRunning = false,在別的地方?

+0

我不打破循環我打電話給方法StopThread,它變成假的 – 2012-08-08 02:50:26