應用程式通常會建立擁有服務的執行緒, 比如執行緒池. 這些服務的存在時間通常要比建立他們的方法存在的時間更長, 如果應用程式優雅的退出了,這些服務的執行緒也需要結束.因為沒有退出執行緒慣用的優先方法, 他們需要自行結束.
明智的封裝實踐指出,你不應該操控某個執行緒一一中斷它,改變他的優先順序,等等... 除非是這個.執行緒的擁有者, 執行緒api沒有關於執行緒所屬權正規的概念. 執行緒通過乙個thread物件表示,和其他物件一樣可以被自由的共享. 但是, 認為執行緒有乙個擁有者是有道理的. 這個擁有者就是建立這個執行緒的類. 所有執行緒池擁有它的工作執行緒, 如果需要中斷這些執行緒. 那麼應該由執行緒池來負責
例如: executorservice 提供的 shutdown 和 shutdownnow 方法.
對於執行緒持有的服務, 只要服務的存在時間大於建立執行緒的方法存在時間,那麼就應該提供生命週期方法(lifecycle method)
publicclass
logservice
public
void
start()
public
void
stop()
loggerthread.interrupt();
}public
void log(string msg) throws
interruptedexception
queue.put(msg);
}private
class loggerthread extends
thread
string msg =queue.take();
synchronized (logservice.this
) writer.println(msg);
} catch (interruptedexception e) }}
finally}}
}
或者使用 executorservice
publicclass
logservice2
public
void
start()
public
void
close()
finally
}public
void
log(string str)
}
publicclass
indexingservice };}
private
boolean
alreadyindexed(file f)
class crawlerthread extends
thread
catch (interruptedexception e)
finally
catch (interruptedexception e1) }}
}private
void crawl(file root) throws
interruptedexception }}
}class indexerthread extends
thread
} catch
(interruptedexception consumed)
}public
void
indexfile(file file) ;
}public
void
start()
public
void
stop()
public
void awaittermination() throws
interruptedexception
public
static
void
main(string args)
});is.start();
is.stop();
try
catch
(interruptedexception e)
system.out.println("the end ");
}}
致命藥丸只有在生產線程與消費執行緒已知的情況下才能使用. indexingservice中的解決方案也可以被擴充套件到多生產者, 只要讓每乙個生產線程都往佇列裡放入乙個藥丸, 並且消費執行緒收到第 n(生產者的數量)個藥丸時停止.
publicclass
checkformail
});}
finally
return
hasnewmail.get();
}private
boolean
checkmail(string host)
}
執行緒的停止
執行緒停止 執行緒的停止 1.停止乙個執行緒 我們一般都會通過乙個變數去控制的。2.如果需要停止乙個處於等待狀態下的執行緒,那麼我們需要通過變數配合notify方法或者interrupt 來使用。public class threaddemo5 extends thread public synch...
多執行緒 執行緒的停止
thread類中stop方法停止執行緒存在安全隱患,怎麼讓乙個執行緒停止執行呢?執行緒的執行一般都是迴圈控制體,通過改變run方法 迴圈控制條件,即可讓執行緒停止。class threadstopdemo system.out.println thread.currentthread getname...
執行緒之停止執行緒
停止執行緒有三種方法 1.建議正常停止 利用次數,不建議死迴圈 2.建議使用標誌位 設定乙個標誌位 3.不要使用stop或者destoy等過時或者jdk不建議使用的方法舉例說明 想讓乙個正在執行的程式停下來,執行其他程式,執行完以後再進行自己的程式 怎麼來解決呢?可以自己設定乙個標識位.在自己的程式...