android執行緒start()、interrupt()之重複使用

安迪潘發表於2011-09-05

這次我遇到的問題是我想開啟一個執行緒每隔100ms監聽一次scrollview滑動高度,start()後執行緒run,監聽30次後停止執行緒,呼叫interrupt()方法中斷執行緒,當再滑動時繼續start()執行緒,30次後interrupt(),問題是如果使用者連續滑動,則是開啟了多個執行緒,如果用執行緒類初始化物件,然後該物件start(),interrupt(),那麼必然會導致僅僅中斷了一個執行緒物件,之前的物件還在不停地執行執行緒。我的解決辦法是:

不初始化物件,直接 new MyThread().start();然後在MyThread()類的run()中判斷當執行了30次後,Thread.currentThread().interrupt();把當前這個類所執行的執行緒中斷,也就不會存在還有這個類的物件沒被中斷繼續執行的情況,也就解決了我的問題。

部分程式碼:

public class MyThread extends Thread{
		int y=9999;
		@Override
		public void run() {
			super.run();
			while(!Thread.currentThread().isInterrupted()){//!Thread.currentThread().isInterrupted()//!thread.isInterrupted()
				if(y!=sc2.getScrollY()){
					y=sc2.getScrollY();
				}else{
					Message msg=new Message();
					msg.what=9;
					mHandler.sendMessage(msg);
				}
				
				Log.v("sc2.getScrollY()!!!!!!!", "sc2.getScrollY():"+sc2.getScrollY());
				if(sc2.getScrollY()==dpi*18*45){//第3輪第一張(0,0)座標處
					
					Message msg=new Message();
					msg.what=8;
					mHandler.sendMessage(msg);
				}
				
				try {
					if(iflg<30){
						Thread.sleep(100);
						iflg=iflg+1;
					}
					
					if(iflg==30){
						Thread.currentThread().interrupt();
//						thread=null;
						iflg=0;
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
			}
		}
	}


相關文章