이 기사는 Java Multithreading의 기본 사용에 대한 요약입니다.
이 기사는 다음 측면에서 Java Multithreading의 기본 사용법을 설명합니다.
멀티 스레딩 사용 방법
스레드를 시작하는 두 가지 방법
Java는 멀티 스레딩을 사용하는 두 가지 방법을 제공합니다. 하나는 스레드를 상속하기 위해 클래스를 작성한 다음 실행 메소드를 덮어 쓰인 다음 시작 메소드를 호출하여 스레드를 시작하는 것입니다. 이 시점 에서이 클래스는 다른 스레드 방식의 실행 메소드에서 코드를 실행합니다. 또 다른 방법은 클래스를 작성하여 실행 가능한 인터페이스를 구현 한 다음 인터페이스 메소드 실행을 구현 한 다음 스레드 객체를 만들고, 런닝 가능한 인터페이스를 구조 매개 변수로 구현하는 클래스를 사용하고, 스레드 객체로 전달하고, 스레드 객체가 시작 메소드를 호출하는 것입니다.
여기서 시작 방법은 내부적으로 실행 메소드를 호출하는 시작 기능이있는 메소드입니다. 따라서 시작 메소드가 호출되는 경우에만 다른 스레드가 시작됩니다. 다른 스레드에서 실행되지 않고 실행 메소드가 직접 호출되거나 같은 스레드에서 실행됩니다.
또한 시작 방법은 가상 시스템에 스레드를 시작할 수 있음을 알려줍니다. 즉, 스레드가 준비 상태에 있음을 의미하지만 시작하려는 호출이 즉시 실행된다는 의미는 아닙니다. 이를 위해서는 JVM이 스레드를 실행할시기를 결정할 때까지 기다려야합니다. 다시 말해, 두 개의 스레드 A와 B가있는 경우 A와 B 호출이 먼저 시작되고 B 호출이 나중에 시작되는 경우 스레드 A가 먼저 실행되고 스레드 B가 나중에 실행된다는 의미는 아닙니다. 이것은 모두 JVM에 의해 결정되며 임의의 시작으로 간주 될 수 있습니다.
아래에서는 실제 코드를 사용하여 스레드를 시작하는 두 가지 방법을 설명합니다.
첫 번째 유형은 스레드를 상속하는 것입니다
public class emableplethread는 strule {@override public void run () {super.run (); System.out.println ( "이것은 스레드에서 상속 된 예제입니다"); }}테스트 코드는 테스트 디렉토리의 examplethreadTest 클래스에서 찾을 수 있습니다.
다른 방법으로, 런닝 가능한 인터페이스를 구현합니다
공개 클래스 예시적인 구현 실행 가능 {public void run () {System.out.println ( "이것은 런닝 가능한 인터페이스를 구현하는 클래스"); }}테스트 코드의 경우 테스트 디렉토리에서 examplerUnableTest 클래스를 볼 수 있습니다.
멀티 스레딩에 대한 정보를 얻는 방법
멀티 스레딩을 시작한 후 일부 API를 통해 시작된 스레드에 대한 정보를 얻을 수 있기를 바랍니다. JDK는 스레드에 대한 정보를 얻을 수있는 스레드 클래스 방법을 제공합니다.
스레드의 이름을 얻으십시오
이러한 방법은 스레드의 내부 방법 이므로이 방법을 두 가지 방식으로 호출 할 수 있습니다. 하나는 클래스가 스레드를 물려받을 때 멀티 스레드를 사용하여이를 사용하여 호출 할 수 있다는 것입니다. 또 다른 방법은 Thread.CurrentThread ()를 통해 이러한 메소드를 호출하는 것입니다. 그러나이 두 가지 방법은 사용 시나리오에서 다릅니다.
두 가지 방법의 사용을 간단히 살펴 보겠습니다.
첫 번째 thread.currentthread ()가 사용되며 코드는 다음과 같습니다.
public class emailplecurrentthread는 스레드 {public emaveplecurrentthread () {system.out.println ( "생성자 인쇄 메소드 :" + thread.currentthread (). getName ()); } @override public void run () {super.run (); System.out.println ( "실행 메소드의 인쇄 :" + thread.currentThread (). getName ()); }}테스트 코드는 다음과 같습니다.
public class emabestlecurrentthreadtest는 testcase를 확장합니다 {public void testinit () throws exception {emaxplecurrentThread 스레드 = 새 emavePlecurrentThread (); } public void testrun ()은 예외를 던져 {examplecurrentThread 스레드 = 새 emavePlecurrentThread (); thread.start (); Thread.sleep (1000); }}결과는 다음과 같습니다.
생성자 인쇄 방법 : 메인 런 인쇄 방법 : 스레드 -0 구성 방법 : 메인
왜 우리가 Thread.currentThread () 내부에서 stride.currentThread ()를 사용하여 CODERETTHREAD 내부에서 CODE SERGIME가 해당 스레드에서 호출되는 정보를 반환하기 때문에 구성 메소드가 기본으로 인쇄 된 것을 표시하기 위해 내부 DEAMPLECURRENTTHREAD를 사용하는 이유는 무엇입니까? 구성 방법은 기본 스레드에 의해 실행되며 실행 방법은 우리가 시작한 스레드에 의해 실행됩니다. 명명되지 않았기 때문에 기본 스레드 -0입니다.
다음으로, 우리는 스레드에서 상속을보고 이것을 부르고 있습니다.
public class complexcurrentthread는 스레드 {public complexcurrentthread () {system.out.println ( "시작 ========="); System.out.println ( "Thread.currentThread (). getName =" + thread.currentThread (). getName ()); System.out.println ( "this.getName () =" + this.getName ()); System.out.println ( "end ==========="); } @override public void run () {super.run (); System.out.println ( "실행 시작 ==========="); System.out.println ( "Thread.currentThread (). getName =" + thread.currentThread (). getName ()); System.out.println ( "this.getName () =" + this.getName ()); System.out.println ( "run end ======================"); }}테스트 코드는 다음과 같습니다.
공개 클래스 ComplexCurrentThreadTest는 TestCase를 확장합니다 {public void testrun ()은 예외 {complexCurrentThread 스레드 = new ComplexCurrentThread (); thread.setname ( "byhieg"); thread.start (); Thread.sleep (3000); }}결과는 다음과 같습니다.
시작 ============= thread.currentThread (). getName = mainthis.getName () = Thread -0end ======================== run ======= strule.currentThread (). getName = byHiegThis.getName () = byHiegrUN
우선, 객체를 생성 할 때 생성자는 메인 스레드에 의해 여전히 실행되므로 Thread.CurrentThread ()는 기본 스레드의 이름을 가져 오지만이 메소드는 메소드, 즉 복합체가있는 스레드 정보를 나타내는 객체를 나타냅니다. 아직 세트 이름이 없으므로 기본 이름입니다. 그런 다음 실행 메소드는 thread.currentthread ()이거나 ByHieg 이름 세트로 스레드 정보를 반환합니다.
따라서 thread.currentthread는이 코드 블록을 구체적으로 실행하는 스레드 정보를 나타냅니다. 생성자는 Main에 의해 실행되며 실행 메소드는 스레드가 시작되고 스레드가 실행을 실행하는 것입니다. 이 관점에서 볼 수있는 정보는 실행 중이지만 실행 메소드가 다른 스레드에 의해 시작되기 때문에이 정보는 부정확합니다. 왜냐하면 실행 메소드가 다른 스레드에 의해 시작되면, 우리는 this.getName을 통해 실행 메소드를 실행하는 새로운 도시의 정보를 얻을 수 없습니다. 또한 스레드를 상속하는 클래스 만 GetName과 같은 방법을 가질 수 있는데, 이는 여러 상속이없는 Java의 기능 언어에 대한 재난입니다. 나중에 얻으려는 스레드에 대한 모든 정보에 대해서는 thread.currentthread ()를 사용하여 API를 호출합니다.
스레드의 ID를 얻으십시오
스레드의 고유 한 식별을 얻으려면 getid에 전화하십시오. 이것은 위의 getName의 사용과 동일합니다. 할 말이 없습니다. exampleIdthread와 그 테스트 클래스 examesidThreadTest를 직접 볼 수 있습니다.
스레드가 살아남는 지 결정합니다
메소드 isalive ()의 기능은 스레드가 활성인지 테스트하는 것입니다. 소위 활성 상태는 스레드가 시작되었지만 종료되지 않았 음을 의미합니다. 즉, 스레드가 시작된 후에는 살아있는 것으로 간주됩니다.
구체적인 예를 살펴 보겠습니다.
Public Class AliveThread는 스레드 {@override public void run () {super.run (); System.out.println ( "런 메소드에서 살아 있습니까? }}테스트 방법은 다음과 같습니다.
Public Class AliveThreadTest는 TestCase를 확장합니다 {public void testrun ()은 예외 {aliveThread 스레드 = new AliveThread (); System.out.println ( "시작 ==" + thread.isalive ()); thread.start (); Thread.sleep (1000); System.out.println ( "end ==" + thread.isalive ()); Thread.sleep (3000); }}결과는 다음과 같습니다.
시작 == 거짓 메소드의 Trueend가 있는지 == false
우리는 시작하기 전에 스레드가 살지 않는 것으로 간주되고 실행되면 살아 있습니다. 실행 방법이 실행되면, 그것은 묻지 않은 것으로 간주됩니다.
스레드를 중지하는 방법
스레드가 종료되었는지 여부를 결정하십시오
JDK는 스레드가 종료되는지 여부를 결정하는 몇 가지 방법을 제공합니다 - IS -interrupted () 및 Interrupted ()
스레드를 중지하는 방법
이는 스레드 정보를 얻는 데있어 더 중요한 방법입니다. 스레드 정보가 종료되는 방법과 관련이 있기 때문입니다. 먼저 스레드를 종료하는 몇 가지 방법에 대해 이야기하겠습니다.
나는 첫 번째 것에 대해 이야기하지 않을 것입니다. 두 번째 stop () 방법은 다음과 같은 이유가 발생할 수 있기 때문에 버려졌습니다.
구체적인 예는 STOPLOCKTHREAD 및 TEST 클래스 STOPLOCKTHREADTEST를 볼 수 있습니다.
세 번째 유형은 현재 권장되는 종료 방법으로 인터럽트를 호출 한 다음 실행 방법에서 종료 될지 여부를 결정합니다. 해지를 판단하는 두 가지 방법이 있습니다. 하나는 스레드 클래스의 정적 메소드 인터럽트 ()이고, 다른 하나는 스레드 멤버 메소드 isterrupted ()입니다. 이 두 방법 사이에는 차이가 있습니다. 첫 번째 방법은 상태를 자동으로 재설정합니다. Interrupted ()가 연속으로 두 번 호출되면 처음으로 허위 인 경우 두 번째로는 사실이어야합니다. 그리고 IS -interrupted ()는 그렇지 않습니다.
예는 다음과 같습니다.
public class exampleinterruptthread는 stread {@override public void run () {super.run (); try {for (int i = 0; i <50000000; i ++) {if (interprupted ()) {System.out.println ( "이미 정지 상태이며 종료하고 싶다"); 새로운 InterruptedException을 던지십시오 ( "stop ......"); } system.out.println ( "i =" + (i + 1)); }} catch (InterpruptedException e) {System.out.println ( "부드럽게 중지"); }}}테스트 코드는 다음과 같습니다.
public class examesinterruptthreadtest는 testcase를 확장합니다 {public void testrun ()은 예외 {exampleinterruptthread 스레드 = 새 exampleinterruptthread (); thread.start (); Thread.sleep (1000); thread.interrupt (); }}네 번째 방법은 세 번째 방법과 동일합니다. 유일한 차이점은 위 코드의 예외를 반환으로 바꾸는 것입니다. 나는 여전히 예외를 던지는 것을 좋아합니다. 여기에는 정보 인쇄, 리소스 폐쇄 또는 캡처 한 다음 다시 상위 계층에 던지는 등 여러 형태의 처리가 있습니다.
우리가 위에서 던진 예외는 중단 된 예고입니다. 여기서 우리는이 예외가 생성 될 수있는 이유에 대해 간단히 이야기합니다. 원래 스레드 수면의 경우 인터럽트를 호출하여 스레드를 종료하거나 실을 먼저 끝내고 나서 스레드를 잠들게하십시오.
스레드를 일시 중지하는 방법
스레드를 일시 정지하고 스레드를 복원하기 위해 JDK에 다음 두 가지 방법이 제공됩니다.
이 두 가지 방법은 정지 방법과 같은 버려진 방법이며, 사용법은 정지, 잔인하게 스레드를 중단하고 스레드를 복원하는 것과 동일합니다. 이 두 가지 방법이 버려진 주된 이유는 다음과 같습니다.
다른 스레드 사용
스레드의 다른 기본 사용법은 다음과 같습니다.
실 양보
JDK는 스레드가 현재 CPU 리소스를 포기하고 CPU 시간을 차지하기 위해 다른 작업에 제공하기 위해 수율 () 메소드를 제공하지만 이것은 또한 임의의 일입니다. 자원을 포기한 직후 시간 슬라이스를 차지할 수 있습니다.
구체적인 예는 ExampleyieldThread 및 Test Class ExampleyieldTest를 참조하십시오.
스레드의 우선 순위를 설정하십시오
우리는 스레드의 우선 순위를 설정하여 CPU가 최대한 우선 순위를 가진 실행 리소스를 스레드로 보낼 수 있도록 최대한 많이 설정할 수 있습니다. Java는 1-10 10 우선 순위 수준을 설정하며 세 가지 우선 순위 수준을 제공하기위한 세 가지 정적 변수가 있습니다.
/*** 스레드가 가질 수있는 최소 우선 순위. */ public final static int min_priority = 1; /*** 스레드에 할당 된 기본 우선 순위. */ public final static int norm_priority = 5; /*** 스레드가 가질 수있는 최대 우선 순위. */ public final static int max_priority = 10;
우리는 set-friority를 통해 스레드의 우선 순위를 설정할 수 있으며, 항소를 위해 세 가지 정적 변수로 직접 전달하거나 1-10 숫자로 직접 전달할 수 있습니다. 설정 후 스레드의 우선 순위가 다릅니다. 우선 순위를 설정하지 않으면 어떻게됩니까?
스레드의 우선 순위는 상속됩니다. 스레드 A에서 스레드 B를 시작하면 AB가 우선 순위가 동일합니다. 일반적으로 기본 스레드에서 스레드를 시작할 때 기본 스레드와 일관된 우선 순위가 있습니다. 기본 스레드의 우선 순위는 기본적으로 5입니다.
우선 순위에 대한 몇 가지 규칙은 다음과 같습니다.
스레드 가드
JDK는 스레드를 데몬 스레드로 설정하는 SetDaemon 메소드를 제공합니다. 데몬 스레드의 특징은 다른 비 데몬 스레드가 실행 된 후에 데몬 스레드가 자동으로 파괴된다는 것입니다. 전형적인 예는 GC 리사이클러입니다.
자세한 내용은 exampledaemonthread 및 exampledaemonthreadtest를 참조하십시오.
요약
이 기사는 주로 Java 스레드의 몇 가지 기본 사용법을 요약하고 스레드 안전 및 동기화에 관한 두 번째 기사에 포함되어 있습니다.
위는이 기사의 모든 내용입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 또한 wulin.com을 더 지원하기를 바랍니다!