자바 생성 스레드 (runnable 인터페이스 및 스레드 클래스)
대부분의 경우 스레드 객체를 인스턴스화하여 스레드가 생성됩니다. Java는 두 가지 방법을 정의합니다.
다음은 각 방법을 차례로 설명합니다.
실행 가능한 인터페이스 구현
스레드를 만드는 가장 쉬운 방법은 런닝 가능한 인터페이스를 구현하는 클래스를 만드는 것입니다. 실행 가능한 코드 실행 장치를 추상화합니다. 실행 가능한 인터페이스를 구현하여 각 객체에 대한 스레드를 만들 수 있습니다. Runnable 인터페이스를 구현하려면 클래스는 간단한 run () 방법 만 구현하면 다음과 같이 선언됩니다.
공개 void run ()
run ()에서는 새 스레드를 구축하기 위해 코드를 정의 할 수 있습니다. 다음을 이해하는 것이 중요합니다. run () 메소드는 다른 메소드를 호출하고 다른 클래스를 참조하며 기본 스레드와 같은 변수를 선언 할 수 있습니다. 유일한 차이점은 run ()이 프로그램에서 또 다른 동시 스레드 실행 항목을 설정한다는 것입니다. run ()가 반환되면 스레드가 끝납니다.
실행 가능한 인터페이스를 구현하는 클래스를 만든 후에는 클래스 내부의 스레드 클래스의 객체를 인스턴스화해야합니다. 스레드 클래스는 여러 생성자를 정의합니다. 우리가 사용할 것은 다음과 같습니다.
스레드 (runnable threadob, String ThreadName)
이 생성자에서 Threadob은 실행 가능한 인터페이스 클래스를 구현하는 인스턴스입니다. 스레드 실행의 시작점을 정의합니다. 새 스레드의 이름은 ThreadName에 의해 정의됩니다.
새 스레드가 생성 된 후에는 strest () 메소드가 호출 될 때까지 실행되지 않으며, 이는 스레드 클래스에 정의됩니다. 기본적으로 start ()는 run ()로 전화를 실행합니다. start () 메소드는 다음과 같이 선언됩니다.
void start ()
다음 예는 새 스레드를 만들고 실행을 시작하는 것입니다.
// 두 번째 스레드 생성 .class newthread는 runnable {newthread () {// 새 스레드를 만듭니다 : " + t); t.start (); // 스레드 시작} // 이것은 두 번째 스레드의 진입 점입니다. public void run () {try {for (int i = 5; i> 0; i. -) {System.out.println (자식 스레드 : Sleep. out .println ( "자식 스레드 종료.}} class ThreadDemo {public static void main (string args []) {new Newthread (); 0; );
Newthread 생성자에서 새 스레드 객체는 다음과 같은 설명에 의해 생성됩니다.
t = 새 스레드 (this, "데모 스레드");
이것은이 객체에서 새 스레드가 run () 메소드를 호출하기를 원한다는 것을 나타냅니다. 그런 다음 start ()가 호출되고 스레드의 실행은 run () 메소드로 시작됩니다. 이로 인해 하위 스레드가 루프가 실행을 시작하게됩니다. start ()를 호출 한 후 Newthread 생성자는 main ()으로 돌아갑니다. 기본 스레드가 복원되면 FOR 루프에 도달합니다. 두 스레드가 계속 실행되어 루프가 끝날 때까지 CPU를 공유합니다. 이 프로그램의 출력은 다음과 같습니다.
자식 스레드 : 스레드 [데모 스레드, 5, 메인] 메인 스레드 : 5CHILD 스레드 : 5CHILD 스레드 : 4 메인 스레드 : 4CHILD 스레드 : 3CHILD 스레드 : 2MAIN 스레드 : 3CHILD 스레드 : 1E Xiting Child 스레드. .
앞에서 언급했듯이 멀티 스레드 프로그램에서 메인 스레드는 일반적으로 실행이 끝나는 마지막 스레드 여야합니다. 실제로, 일부 이전 JVM의 경우, 메인 스레드가 자식 스레드 전에 끝나면 Java 런타임 시스템이 "교수형"될 수 있습니다. 앞서 언급 한 프로그램은 메인 스레드가 1000 밀리 초 동안 잠을 자고 하위 스레드는 500 밀리 초에 불과하기 때문에 주 스레드가 끝에서 끝나도록합니다. 이로 인해 기본 스레드가 끝나기 전에 자식 스레드가 끝납니다. 요컨대, 당신은 스레드가 끝날 때까지 더 좋은 방법을 볼 수 있습니다.
확장 된 스레드
스레드를 만드는 또 다른 방법은 스레드 클래스를 확장하는 새 클래스를 작성한 다음 해당 클래스의 인스턴스를 작성하는 것입니다. 클래스가 스레드를 상속하면 새 스레드의 항목 인 run () 메소드를 과부하해야합니다. 또한 새 스레드 실행을 시작하려면 start () 메소드를 호출해야합니다. 다음은 이전 프로그램을 확장 된 스레드 클래스로 다시 작성하는 것입니다.
// 스레드를 확장하여 두 번째 스레드를 만듭니다. NewThread는 {newthread () {// System.out.printl n ( "child stread :" + this)을 만듭니다 (); // 스레드 시작} // 두 번째 스레드의 진입 점입니다 (int i = 5; i> 0; i-) (자식 스레드 : " + i); ");}} class ExtendThread {public static void main (String args []) {new NewThread (); 새 스레드 생성 {for (int i = 5; i> 0; i-) {시스템. out : : : : : : : : : : : .println ( "주 스레드 :" + i); 메인 스레드가 중단되었습니다. ");} system.ou t.println ("메인 스레드 종료. ");}}
이 프로그램은 이전 버전과 동일한 출력을 생성합니다. 자식 스레드는 스레드 클래스에서 파생 된 인스턴스형 NewThread 객체에 의해 생성됩니다. Newthread에서 Super ()에 대한 호출에 유의하십시오. 이 방법은 다음 양식의 스레드 생성자를 호출합니다.
공개 스레드 (String ThreadName)
여기에서 ThreadName은 스레드 이름을 지정합니다.
올바른 방법을 선택하십시오
이 시점에서 Java가 왜 자식 스레드를 만들 수있는 두 가지 방법이 있는지 궁금 할 것입니다. 모든 질문은 한 지점에 기인합니다. 스레드 클래스는 파생 클래스에서 과부하 할 수있는 다양한 방법을 정의합니다. 모든 방법의 경우 과부하해야 할 유일한 것은 run () 메소드입니다. 물론 런닝 가능한 인터페이스를 구현하는 데 필요한 동일한 방법입니다. 많은 Java 프로그래머는 클래스가 강화되거나 수정 될 때만 확장되어야한다고 생각합니다. 따라서 다른 스레드 방법에 과부하가 걸리지 않으면 런닝 가능한 인터페이스 만 구현하는 것이 가장 좋습니다. 물론 결정하는 것은 당신에게 달려 있습니다. 그러나이 장의 다른 부분에서는 실행 가능한 인터페이스를 구현하여 스레드를 만드는 클래스를 적용합니다.