자바랑을 어떻게 죽이죠?자바어로 스레드?
일반적으로는 그렇지 않습니다.
[Thread]를 사용하여 어떤 작업을 수행하든 중단하도록 요청합니다.interrupte(인터럽트 링크)]1
자바독 여기(java technote 링크)에 있는 이유에 대한 좋은 설명이 있다.
자바 가상 머신 (jvm) 에 죽었고, 그러나 스래드입니다 중단 없는 스레드 완료되어도 협력 운행에서어떠한 받을시간은 . 스레드 (thread) 는 이에 대해 종료시킵니다 및 hutdown 정상적으로 할 수 있습니다.
자주 사용되는 필드를 주기적으로 점검 및 휘발성 부울입니다 'a' 로 설정되어 있는 경우 해당 값을 스레드할 종료합니다.
내가 안 될 것 "이라고 종료시킵니다 스레드할 여부를 확인할 수 있는 '부울입니다' 사용 한다. '현장' 를 사용하는 경우 이 사용할 수 있는 휘발성 수정자의 신앙이니라 코드에 대한 차단 방법을 사용하는 것이 아니라, 더욱 복잡한 내부 루프 수도 있지만, 동시에 발생할 수 있는 '다른' 으로 더 많은 것은, 적어도 종료시킵니다 코드가 전혀 할 수 있습니다.
>. 특정 차단 라이브러리란 메서드을 지원부에서는 중단.
이미 모든 스레드할 중단된 상태 부울입니다 플래깅 진실이며당신이 이용해야 합니다. 이렇게 구축할 수 있습니다.
public void run() {
try {
while (!interrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
소스 코드 발췌 jave 동시성 실제로. '공개 이후 취소 ()' 이 방법을 사용하면 스레드할 호출하십시오 그들이성년에 때 다른 방법을 사용할 수 있습니다.
한 가지 방법은 클래스 변수를 설정하고 이를 Sentinel로 사용하는 것이다.
Class Outer {
public static volatile flag = true;
Outer() {
new Test().start();
}
class Test extends Thread {
public void run() {
while (Outer.flag) {
//do stuff here
}
}
}
}
외부 클래스 변수(예: 위의 예에서는 플래그 = true)를 설정합니다. 실을 거짓으로 설정하세요.
어떻게 할 수 있는 방법이 있습니다. 그러나 했을 경우, 바로 사용할 수 있고, 나쁜 프로그래머용 또는 나쁜거라 프로그래머가 작성한 코드를 사용하고 있습니다. 그러니까 이 악성 코드 사용 중지 또는 중지 나쁜 프로그래머용 생각해야 할 수 있다. 이 솔루션은 상황에서 대해서만 다른 방법이 없다.
Thread f = <A thread to be stopped>
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );
여러 의견에 따라 추가 관측을 통해 축적된 가지고 싶다.
예를 들어 있는 경우 등 장시간용 작업 (like a 네트워크 요청). 아마도 당신은 응답을 기다리고 있지만, 사용자가 다른 UI 않은 시간이 걸릴 수 있습니다. 그는 이제 이 기다림커서 스레드할) 쓸모 없는 b) 의 결과를 얻을 수 있는 문제를 이유는열 it& # 39 완전히 쓸모 없는 그가 트리거됩니다 콜백 이어질 수 있는 오류 수입니다.
그는 모든 것을 그 응답을 받을 수 있는 CPU 처리 할 수 있는 예다. 왜냐하면 당신은 진실이며당신이, 개발자의, # 39, t throw can& 고만하세요 할 수 없습니다 "만약 (트레더스쿠르나토레더 스이신터럽테드 () ()) '에서 흐름선 모든 코드.
이 때문에 강제로 정지점을 괴상하죠 스레드할 한 수 없음)
문제는 대답하도다 막연한. 그 경우 "how do I write 프로그램을 실행할 수 있도록 내가 원할 때 스레드할 정지점으로 迈向" 등 다양한 반응을 관심용 도움됐네 합니다. 만일 너희가 무엇을 뜻하는지 "나는 응급상황입니다 서버와 함께 잠이 재시작하여, 난 그냥 지금 할 수 있습니다, 어떤 특정 따라오렴 스레드할 to die" 를 일치시키려면 모니터링 툴을 이스타크 'like' 적극적인 개입을 도구에서는 합니다.
이를 위해 내가 만든 [이킬트레더] (https://github.com/jglick/jkillthread). 사용 방법은 봅니다.
물론 코드 실행 중인 함정이거나 아직 완전히 신뢰할 수 있는 사례가 있습니다. (개인적으로 이렇게 내 실행할 수 있게 함으로써 업로드됨 스크립트에만 자바 환경으로. 네 가지 보안 경보를 울리고 종소리에서 it& # 39 의 모든 부분은 있지만, 응용 프로그램) 이 모든 것을 요구하는 것은 단순히 희망을 인스턴스입니다 먼저 존중해야 할 함정이거나 부울입니다 run/don& 스크립트입니다 작성기에 있다 # 39, t 실행하십시오 신호. 괜찮은 fail safe 는 해결할 수 있는 유일한 방법은 더 이상 일부 정보기술 (it) 의 경우 security. 정지점을 스레드할 말하도다 런입니다 시간초과했습니다.
하지만 이것은 단지 " decent" 아니라, 이 때문에, 절대 따라 잡을 수 있도록 코드를 트레이디아스 오류 (또는 있는모든 idfsysobject. 직접 투사) 레트로프 아니라 해야 할 마음이 있어 마치 신사적인 요컨대 아파이어 페일오버합니다 금고에도요 절대 없다.
방법이 없어 정상적으로 죽일거라고 실타래야
할 수 있습니다 사용할 수 있는 한 커먼즈 전략은 인터럽트입니다 스레드할 스레드할 중지되기를 자체에 대한 메시지가 포이즌 필
public class CancelSupport {
public static class CommandExecutor implements Runnable {
private BlockingQueue<String> queue;
public static final String POISON_PILL = “stopnow”;
public CommandExecutor(BlockingQueue<String> queue) {
this.queue=queue;
}
@Override
public void run() {
boolean stop=false;
while(!stop) {
try {
String command=queue.take();
if(POISON_PILL.equals(command)) {
stop=true;
} else {
// do command
System.out.println(command);
}
} catch (InterruptedException e) {
stop=true;
}
}
System.out.println(“Stopping execution”);
}
}
}
BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);
일반적으로 너회가 don& # 39, t kill, 정지 또는 인터럽트입니다 스레드 (또는 처리 여부 확인 중단 () 은 정보기술 (it) 이지만, let it 종료시킵니다 자연스럽게.
간단합니다. 루프 (휘발성) 와 함께 사용할 수 있습니다 () 메서드를 사용하여 제어입니다 thread& # 39 의 내부 변수 부울을 실행하십시오 활동까지입니다. 주요 활성 에서 그만두시요 스레드를 스레드할 반품해야 수도 있습니다.
이 방법은 죽이는 정상적으로 스레드할:) .
갑자기 의 잘 알려진 나쁜거라 프로그래밍 연습 및 애플리케이션 설계 케이블링의 우심방도 스레드할 종료하십시오 시도_횟수 있다. 다중 스레드 응용 프로그램을 공유할 수 있는 모든 스래드입니다 명시적 또는 암시적으로 같은 프로세스 상태를 유지하기 위해, 그렇지 않으면 강제 서로 협력해 일관적이며 될 위험이 될 수 있는 응용 프로그램을 위해 정말 열심히 버그에 대해 진단하십시오. 그래서 이런 역할을 통해 애플리케이션 개발자 제공하기 위해 보증 정합성의 자세히 선택해제합니다 설계.
최적의 솔루션을 제어됩니다 스래드입니다 대한 두 가지 주요 종단.
갑자기 스래드입니다 종료하십시오 관련된 문제에 대한 자세한 설명이 있을 뿐 아니라 좋은 예는 잘못된 및 오른쪽 솔루션을 제어됩니다 스래드입니다 종료하십시오 여기에서 찾을 수 있습니다.
내가 didn& # 39, 안드로이드, 그래서 이 방법을 사용할 수 없는 인터럽트입니다 내려받습니다 작업하십시오 작동됨 완벽하게:
boolean shouldCheckUpdates = true;
private void startupCheckForUpdatesEveryFewSeconds() {
Thread t = new Thread(new CheckUpdates());
t.start();
}
private class CheckUpdates implements Runnable{
public void run() {
while (shouldCheckUpdates){
//Thread sleep 3 seconds
System.out.println("Do your thing here");
}
}
}
public void stop(){
shouldCheckUpdates = false;
}
실행 가능한 어떤 난 사용합니다.
"' 실행 가능한 클래스 타스카트레더 는 {
부울입니다 서우두스토프.
공용 타스카트레더 (부울입니다 서우두스토프) { 티스트시울드스토프 = 서우두스토프. }
@Override public void 실행하십시오 () {
시스템지우트리프린틀린 (,) 는 " 스레드할 started").
반면 (! 서우두스토프) { 뭔가 // }
시스템지우트리프린틀린 (,) 는 " 스레드할 ended").
}
public void 정지점을 () { 서우두스토프 = true. }
} "'
트리거하는 클래스:
"' public class 트레더스토프 {
public static void main (문자열 [] args) {
시스템지우트리프린틀린 (Start" ";).
스레드할 시작합니다. // 타스카트레더 작업 = new 타스카트레더 (false). 새로운 스레드할 스레드할 t = (task). 트리스타르트 ();
스레드할 중지하시겠습니까 // 타스크리스토프 ();
시스템지우트리프린틀린 (End" ";).
}
} "'