我們需要一段代碼來控制線程。例如,使用三個按鈕(如開始,停止和暫停),按其中一個按鈕並對其執行操作。像按開始然後開始線程,按停止實際上停止線程和暫停執行暫停動作分別。通過按鈕控制線程
Q
通過按鈕控制線程
4
A
回答
4
啓動線程很簡單,Thread.start()
。停止線程可以像設置在run方法中異步檢查的標誌一樣簡單,但可能需要包含對Thread.interrupt()
的調用。暫停一個線程會產生更多問題,但也可以使用一個使運行方法放棄而不是進程的標誌來完成。這裏是一些(未經測試的)代碼:
class MyThread extends Thread {
private final static int STATE_RUN = 0, STATE_PAUSE = 2, STATE_STOP = 3;
private int _state;
MyThread() {
_state = STATE_RUN;
}
public void run() {
int stateTemp;
synchronized(this) {
stateTemp = _state;
}
while (stateTemp != STATE_STOP) {
switch (stateTemp) {
case STATE_RUN:
// perform processing
break;
case STATE_PAUSE:
yield();
break;
}
synchronized(this) {
stateTemp = _state;
}
}
// cleanup
}
public synchronized void stop() {
_state = STATE_STOP;
// may need to call interrupt() if the processing calls blocking methods.
}
public synchronized void pause() {
_state = STATE_PAUSE;
// may need to call interrupt() if the processing calls blocking methods.
// perhaps set priority very low with setPriority(MIN_PRIORITY);
}
public synchronized void unpause() {
_state = STATE_RUN;
// perhaps restore priority with setPriority(somePriority);
// may need to re-establish any blocked calls interrupted by pause()
}
}
正如你所看到的,它可以很快地變得複雜,這取決於你在線程中做什麼。
+1
使用'this.wait()'而不是'yield()'並將'this.notify()'添加到'unpause()'和'stop()'可能會更好一些。 。 – 2010-07-05 22:14:36
2
我想對理查德的答案添加到解決的幾個問題:
- 不用週期暫停 當狀態改變
yield()
用在wait()
需要- 單實例
- 不用額外的週期時
- 停止線程等待線程完成
這是我改變代碼:
class MyThread extends Thread {
private final static int STATE_RUN = 0, STATE_PAUSE = 2, STATE_STOP = 3;
private int _state;
private static MyThread thread;
public static MyThread getInstance() {
if (thread == null || !thread.isAlive()) {
thread = new MyThread();
}
return thread;
}
private MyThread() {
_state = STATE_RUN;
}
public static void main(String[] args) {
MyThread t = MyThread.getInstance();
try {
t.start();
Thread.sleep(500);
t.pause();
Thread.sleep(500);
t.unpause();
Thread.sleep(500);
t.end();
} catch (InterruptedException e) {
// ignore; this is just an example
}
}
public void run() {
int i = 0;
while (_state != STATE_STOP) {
if (_state == STATE_PAUSE) {
System.out.println(this + " paused");
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
}
}
}
if (_state == STATE_STOP) {
break;
}
// this is where the actual processing happens
try {
// slow output down for this example
Thread.sleep(100);
} catch (InterruptedException e) {
// state change handled next cycle
}
System.out.println(this + " cycle " + i);
i++;
}
System.out.println(this + " finished");
// cleanup
}
public synchronized void end() {
_state = STATE_STOP;
try {
this.interrupt();
this.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void pause() {
_state = STATE_PAUSE;
}
public synchronized void unpause() {
_state = STATE_RUN;
synchronized (this) {
this.notify();
}
}
}
的
相關問題
- 1. ASP.NET核心通過按鈕控制
- 2. 通過擺動按鈕停止線程
- 3. 通過單個按鈕控制多個按鈕
- 4. 通過線程訪問控制
- 5. JavaFX:通過控制器按下按鈕繪製畫布
- 6. Android - 通過按鈕控制循環的流程
- 7. 通過線段控制
- 8. 通過主線程控制工作線程的工作
- 9. 如何通過通知按鈕控制mediaPlayer?
- 10. 按鈕控制?
- 11. 控制按鈕
- 12. 如何通過按下Java Swing按鈕來停止線程?
- 13. 通過控制繪製垂直線
- 14. 通過TicTacToe按鈕創建一條線
- 15. 通過視圖控制器中的alertview按鈕顯示一個按鈕
- 16. 如何通過自定義按鈕控制音量(不是Android設備按鈕)
- 17. 通過按鈕
- 18. 通過按鈕啓動AsyncFileUpload控件
- 19. 通過GUI按鈕控制的第一人稱角色控制器
- 20. 通過按鈕連線多個按鈕然後在Android
- 21. 多線程 - 按鈕單擊事件 - 用戶控制
- 22. UIPage控制按鈕
- 23. 訪問中通過按鈕/鏈接軌控制器
- 24. 如何通過Winform中的數字鍵控制按鈕?
- 25. 通過瀏覽器控制JQuery多步表單後退按鈕
- 26. 通過按鈕調用控制器功能
- 27. 通過選擇一個按鈕刪除視圖控制器
- 28. 我想通過手機控制Android的後退按鈕
- 29. 如何通過按鈕點擊控制tabbar項目?
- 30. 通過訪問控制中啓用表單按鈕
可能重複[啓動和停止通過按鈕控制線(http://stackoverflow.com/questions/3178129/start-and-stop-thread-control-通過按鈕) – 2010-07-05 16:41:19