停止基於服務的執行緒

2022-07-27 09:54:13 字數 2458 閱讀 6349

應用程式通常會建立擁有服務的執行緒, 比如執行緒池. 這些服務的存在時間通常要比建立他們的方法存在的時間更長, 如果應用程式優雅的退出了,這些服務的執行緒也需要結束.因為沒有退出執行緒慣用的優先方法, 他們需要自行結束.

明智的封裝實踐指出,你不應該操控某個執行緒一一中斷它,改變他的優先順序,等等... 除非是這個.執行緒的擁有者, 執行緒api沒有關於執行緒所屬權正規的概念. 執行緒通過乙個thread物件表示,和其他物件一樣可以被自由的共享. 但是, 認為執行緒有乙個擁有者是有道理的. 這個擁有者就是建立這個執行緒的類. 所有執行緒池擁有它的工作執行緒, 如果需要中斷這些執行緒. 那麼應該由執行緒池來負責

例如: executorservice 提供的 shutdown 和 shutdownnow 方法.

對於執行緒持有的服務, 只要服務的存在時間大於建立執行緒的方法存在時間,那麼就應該提供生命週期方法(lifecycle method)

public

class

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 

public

class

logservice2

public

void

start()

public

void

close()

finally

}public

void

log(string str)

}

public

class

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(生產者的數量)個藥丸時停止. 

public

class

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不建議使用的方法舉例說明 想讓乙個正在執行的程式停下來,執行其他程式,執行完以後再進行自己的程式 怎麼來解決呢?可以自己設定乙個標識位.在自己的程式...