때로는 실이 유용합니다. 예를 들어, 별도의 스레드를 사용하여 하루의 시간을 표시 할 수 있습니다. 사용자가 시계를 사용하지 않으려면 스레드가 일시 중단됩니다. 어쨌든 스레드를 중단하는 것은 매우 간단하며 일단 매달리면 스레드를 다시 시작하는 것도 간단한 문제입니다.
스레드가 현탁, 종료 및 복원되는 메커니즘은 Java 2 및 이전 버전에서 다릅니다. Java 2를 사용하여 코드를 작성하지만 초기 Java 환경에서 이러한 작업이 어떻게 수행되었는지 이해해야합니다. 예를 들어, 이전 코드를 업데이트하거나 유지해야 할 수도 있습니다. 또한 Java 2가 그러한 변화가있는 이유를 이해해야합니다. 이러한 이유로 다음은 스레드 제어를 실행하는 원래 방법을 설명하고 Java 2 메소드를 설명합니다.
Java 1.1 이하의 스레드의 일시 중지, 복구 및 종료
JAVA2 버전 이전에 프로그램은 스레드 정의 SUSTNEND () 및 RESUME ()를 사용하여 스레드를 일시 중지하고 다시 시작합니다. 그들은 다음의 형태입니다.
Final Void Spelend () Final Void Resume ()
다음 절차는 이러한 방법을 설명합니다.
// SPENTEND ()를 사용합니다. out .println ( " + t); i> 0; i) {system.out.println (이름 +) : " + i)} catch (interruptedException e) {system.out.println (name +"). ": : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :); Newthread (Newthread) (Two) (1000); .Sleep (1000); 수면 (1000); ob2.t.resume (). 스레드가 끝날 때까지 {system.out.println (스레드가 완료되기를 기다리고 있습니다.); println ( "메인 스레드 인터럽트")} system.o ut.println ( "메인 스레드 종료"); 프로그램 출력의 일부는 다음과 같습니다.
새 스레드 : 스레드 [1, 5, main] One : 15New 스레드 : 스레드 [2, 5, 메인] 2 : 15one : 14two : 14one : 13two : 13one : 12two : 11two : 11suspending stread onetwo : 10two : 9two : 8two : 7two : 6 스레드 소지 보급 스레드 2 번 : 10one : 9one : 8one : 7one : 6 스레드를 위해 스레드를 위해 스레드를 twowaiting two : 5one : 5two : 4two : 3one : 3 two : 2one : 2two : 1one : 1two exiting -exiting . 메인 스레드 종료.
스레드 클래스는 또한 스레드를 종료하기 위해 stop ()을 정의합니다. 그 형태는 다음과 같습니다.
void stop ()
스레드가 종료되면 Resume ()을 통해 계속 실행되도록 재개 할 수 없습니다.
자바에서 스레드를 일시 중단, 복원 및 종료하십시오
Thread-Defined Spelend (), recume () 및 stop () 메소드는 스레드를 관리하는 완벽하고 편리한 방법으로 보이며 새로운 Java 버전의 프로그램에서는 사용할 수 없습니다. 이유는 다음과 같습니다. 스레드 클래스의 SPESSEND () 메소드는 JAVA2에서 선호하지 않습니다. SUSTEND ()는 때때로 심각한 시스템 실패를 유발할 수 있기 때문입니다. 중요한 데이터 구조에 대한 스레드가 잠겨 있다고 가정하면 스레드가 매달리면 잠긴 스레드는 자원의 제어를 포기하지 않습니다. 이러한 리소스를 기다리는 다른 스레드가 교착 상태에 빠질 수 있습니다.
이력서 () 메소드도 승인되지 않았습니다. 문제를 일으키지 않지만 SPERNEND () 메소드 없이는 독립적으로 사용할 수 없습니다. 스레드 클래스의 정지 () 메소드는 Java 2에서도 반대됩니다. 이 방법은 심각한 시스템 고장을 일으킬 수 있기 때문입니다. 스레드가 정확하고 중요한 데이터 구조를 작성하고 그 중 하나만 완료한다고 상상해보십시오. 이 순간에 스레드가 종료되면 데이터 구조는 충돌 상태로 유지 될 수 있습니다.
java 2에서 sport (), recume () 및 stop () 메소드는 스레드를 제어하는 데 사용할 수 없으므로 스레드를 중지, 복원 및 종료 할 수있는 방법이 없다고 생각할 수 있습니다. 실제로는 그렇지 않습니다. 대신, run () 메소드가 정기적으로 검사하여 스레드가 자체 실행을 일시 중지, 재개 또는 종료 해야하는지 확인하도록 스레드를 설계해야합니다. 대표적으로, 이것은 스레드의 상태를 나타내는 플래그 변수를 설정하여 수행됩니다. 플래그가 "실행"으로 설정된 한 run () 메소드는 스레드에 의해 계속 실행되어야합니다. 플래그가 "삭제"인 경우 스레드를 일시 중지해야합니다. "정지"로 설정되면 스레드를 종료해야합니다.
물론 그러한 코드를 작성하는 방법에는 여러 가지가 있지만 중심 주제는 모든 프로그램에 대해 동일해야합니다.
다음 예제는 객체에서 상속 된 Wait () 및 notify () 메소드가 스레드의 실행을 제어하는 방법을 보여줍니다. 이 예는 앞에서 언급 한 프로그램과 매우 유사합니다. 그러나 승인되지 않은 방법 중 어느 것도 유용하지 않습니다. 프로그램 실행에 대해 생각해 봅시다.
Newtread 클래스에는 스레드 실행을 제어하는 데 사용되는 인스턴스 변수 SmentendFlag가 포함되어 있습니다. 생성자에 의해 False로 초기화됩니다. run () 메소드에는 SpendFlag의 동기화 선언을 모니터링하는 블록이 포함되어 있습니다. 변수가 true 인 경우 대기 () 메소드가 호출되어 스레드를 중단합니다. mysuspend () 메소드는 spendflag를 true로 설정합니다. Myresume () 메소드는 SpendFlag를 False로 설정하고 Notify () 메소드를 호출하여 스레드를 불러냅니다. 마지막으로 Main () 메소드는 MySuspend () 및 Myresume () 메소드를 호출하도록 수정됩니다.
// java2class에 대한 스레드를 구현할 수 있습니다. out .println (새로운 스레드 : siltflag = false}; t i = 15; }}} catch (InterpruptedException e) {system.out.println (name + "Interruped void myresume () {sportnflag = false ()} spectendresume (String args []) {Newthread OB1 ( "One"); try {thread.sleft.println (1000); Thread One "); ob2.mysuspend (); System.out.println ("스레드 2 개 "); 스레드 .sleep (1000); ob2.myresume (); System.out.println ("스레드 t wo ") } catch (InterruptedException e) {System.out.println ( "메인 스레드 인터럽트"); t.join (); OB2.t.join ()} {system.out.println ( "메인 스레드"); }이 프로그램의 출력은 이전 프로그램의 출력과 동일합니다. 이 책의 뒷부분에서는 Java 2 메커니즘을 사용하여 스레드를 제어하는 더 많은 예를 보게 될 것입니다. 그러나이 메커니즘은 이전 방법만큼 "깨끗한"것이 아니지만 런타임에 오류가 발생하지 않도록하는 방법입니다. 모든 새 코드가 취해야하는 방법입니다.