스레드가 실행 중인지 어떻게 확인합니까?
답변
Thread.isAlive()
답변
이 방법을 사용할 수 있습니다.
boolean isAlive()
스레드가 아직 살아 있으면 true를 반환하고 스레드가 죽으면 false를 반환합니다. 이것은 정적이 아닙니다. Thread 클래스의 개체에 대한 참조가 필요합니다.
한 가지 더 팁 : 새 스레드가 실행되는 동안 메인 스레드가 대기하도록 상태를 확인하는 경우 join () 메서드를 사용할 수 있습니다. 더 편리합니다.
답변
GetState () 사용할 수 있다고 생각합니다 . 스레드의 정확한 상태를 반환 할 수 있습니다.
답변
을 호출하여 스레드 상태를 확인하십시오 Thread.isAlive
.
답변
정확히 말하면
Thread.isAlive()
스레드가 시작되었지만 (아직 실행 중이 아닐 수도 있음) 실행 메서드가 아직 완료되지 않은 경우 true를 반환합니다.
Thread.getState()
스레드의 정확한 상태를 반환합니다.
답변
Thread.State 열거 형 클래스와 새로운 getState () API는 스레드의 실행 상태를 쿼리하기 위해 제공됩니다.
스레드는 주어진 시점에서 하나의 상태에만있을 수 있습니다. 이러한 상태는 운영 체제 스레드 상태 [ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
]를 반영하지 않는 가상 머신 상태입니다 .
enum Thread.State 확장 Enum 구현 Serializable , Comparable
-
getState ()
jdk5
–public State getState() {...}
« 스레드 상태를 반환합니다this
. 이 방법은 동기화 제어가 아닌 시스템 상태 모니터링에 사용하도록 설계되었습니다. -
isAlive () –
public final native boolean isAlive();
« 호출 된 스레드가 아직 살아 있으면 true를 반환 하고 그렇지 않으면 false를 반환합니다 . 스레드는 시작되었지만 아직 죽지 않은 경우 살아있는 것입니다.
클래스 java.lang.Thread
및 sun.misc.VM
.
package java.lang;
public class Thread implements Runnable {
public final native boolean isAlive();
// Java thread status value zero corresponds to state "NEW" - 'not yet started'.
private volatile int threadStatus = 0;
public enum State {
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
}
public State getState() {
return sun.misc.VM.toThreadState(threadStatus);
}
}
package sun.misc;
public class VM {
// ...
public static Thread.State toThreadState(int threadStatus) {
if ((threadStatus & JVMTI_THREAD_STATE_RUNNABLE) != 0) {
return Thread.State.RUNNABLE;
} else if ((threadStatus & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
return Thread.State.BLOCKED;
} else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_INDEFINITELY) != 0) {
return Thread.State.WAITING;
} else if ((threadStatus & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT) != 0) {
return Thread.State.TIMED_WAITING;
} else if ((threadStatus & JVMTI_THREAD_STATE_TERMINATED) != 0) {
return Thread.State.TERMINATED;
} else if ((threadStatus & JVMTI_THREAD_STATE_ALIVE) == 0) {
return Thread.State.NEW;
} else {
return Thread.State.RUNNABLE;
}
}
}
예 와는 java.util.concurrent.CountDownLatch
메인 쓰레드가 실행하는 모든 스레드를 완료 한 후, 여러 스레드 평행을 실행합니다. (병렬 스레드가 작업을 완료 할 때까지 기본 스레드가 차단됩니다.)
public class MainThread_Wait_TillWorkerThreadsComplete {
public static void main(String[] args) throws InterruptedException {
System.out.println("Main Thread Started...");
// countDown() should be called 4 time to make count 0. So, that await() will release the blocking threads.
int latchGroupCount = 4;
CountDownLatch latch = new CountDownLatch(latchGroupCount);
new Thread(new Task(2, latch), "T1").start();
new Thread(new Task(7, latch), "T2").start();
new Thread(new Task(5, latch), "T3").start();
new Thread(new Task(4, latch), "T4").start();
//latch.countDown(); // Decrements the count of the latch group.
// await() method block until the current count reaches to zero
latch.await(); // block until latchGroupCount is 0
System.out.println("Main Thread completed.");
}
}
class Task extends Thread {
CountDownLatch latch;
int iterations = 10;
public Task(int iterations, CountDownLatch latch) {
this.iterations = iterations;
this.latch = latch;
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + " : Started Task...");
for (int i = 0; i < iterations; i++) {
System.out.println(threadName + " : "+ i);
sleep(1);
}
System.out.println(threadName + " : Completed Task");
latch.countDown(); // Decrements the count of the latch,
}
public void sleep(int sec) {
try {
Thread.sleep(1000 * sec);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@또한보십시오
답변
스레드가 완료되면 다른 스레드에 알립니다. 이렇게하면 항상 무슨 일이 일어나고 있는지 정확히 알 수 있습니다.