이 두 개의 Runnable이 있다고 가정 해보십시오.
class R1 implements Runnable {
public void run() { … }
…
}
class R2 implements Runnable {
public void run() { … }
…
}
그렇다면 이것의 차이점은 무엇입니까?
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
r1.run();
r2.run();
}
이:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
답변
첫 번째 예 : 여러 스레드가 없습니다. 둘 다 단일 (기존) 스레드에서 실행됩니다. 스레드 생성이 없습니다.
R1 r1 = new R1();
R2 r2 = new R2();
r1
그리고 r2
도구 용 클래스의 두 상이한 개체 Runnable
인터페이스 따라서 구현 run()
방법. 호출 r1.run()
하면 현재 스레드에서 실행 중입니다.
두 번째 예 : 두 개의 별도 스레드.
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1
그리고 t2
클래스의 객체입니다 Thread
. 를 호출 t1.start()
하면 새 스레드가 시작되고 내부적으로 해당 run()
메소드를 호출하여 r1
해당 새 스레드 내에서 스레드를 실행합니다.
답변
방금 run()
직접 호출 하면 다른 메소드 호출과 마찬가지로 호출 스레드에서 실행됩니다. Thread.start()
runnable의 run
메소드가 병렬로 실행 되도록 실제로 새 스레드를 작성하는 데 필요합니다 .
답변
차이점은 메소드 Thread.start()
를 호출하는 스레드 를 시작하는 run()
반면 현재 스레드 Runnable.run()
에서 run()
메소드를 호출하는 것입니다.
답변
차이는 프로그램이 호출 할 때이다 start()
방법을하는 새로운 스레드가 생성되고 코드 내부가 run()
실행되지 않은 새로운 전화 할 경우 동시에 스레드 run()
방법을 직접 새로운 스레드가 생성되고 코드 내부를 run()
직접 현재의 thread로 실행됩니다.
Java 스레드 와의 또 다른 차이점 은 두 번 호출 할 수 없다는 것 입니다. 일단 시작되면 두 번째 호출은 Java에서 발생하지만 메소드는 일반적인 메소드 이므로 여러 번 호출 할 수 있습니다 .start()
run()
start()
start()
IllegalStateException
run()
답변
실제로 Thread.start()
새 스레드를 만들고 자체 실행 시나리오가 있습니다.
Thread.start()
run()
메소드를 비동기식으로 호출하여 새 스레드의 상태를 Runnable로 변경합니다.
그러나 Thread.run()
새로운 스레드를 만들지 않습니다. 대신 현재 실행중인 스레드에서 run 메소드를 동 기적으로 실행합니다.
사용중인 경우 Thread.run()
멀티 스레딩 기능을 전혀 사용하지 않습니다.
답변
invoke run()
는 다른 메소드 호출과 마찬가지로 호출 스레드에서 실행됩니다. 반면 Thread.start()
새로운 스레드를 만듭니다. 호출 run()
은 프로그래밍 방식의 버그입니다.
답변
run()
main 메소드에서 수행하는 경우 main 메소드의 스레드는 run
실행해야하는 스레드 대신 메소드를 호출합니다 .
이 start()
메소드는 새 스레드를 작성하고 run()
메소드를 수행해야합니다.