Java 멀티 스레딩의 사용을 간단히 소개했습니다. 나는 이미 스레드 클래스와 실행 가능한 클래스를 소개했습니다. 멀티 스레딩을 더 잘 이해하기 위해이 기사는 스레드에 대한 자세한 분석을 수행합니다.
시작()
먼저 API 에서이 방법의 도입을 살펴 보겠습니다.
스레드가 실행을 시작하게합니다. Java Virtual Machine은 Thread의 실행 메소드를 호출합니다.
결과적으로 두 스레드가 동시에 실행됩니다. 현재 스레드 (통화에서 시작 메소드로 반환 됨)와 다른 스레드 (실행 메소드 실행).
스레드를 여러 번 시작하는 것은 불법입니다. 특히 스레드가 실행 된 경우 다시 시작할 수 없습니다.
시작 방법을 사용하여 스레드를 시작하여 멀티 스레딩을 실현합니다. 현재 실행 메소드 바디 코드가 실행을 완료하고 다음 코드를 직접 실행할 때까지 기다릴 필요가 없습니다. 스레드 클래스의 start () 메소드를 호출하여 스레드가 시작됩니다. 이 시점에서 스레드는 준비된 (런 가능한) 상태에 있으며 실행되지 않습니다. CPU 시간 슬라이스가 얻어지면 run () 메소드가 실행되기 시작합니다. 여기서는 run ()을 스레드 본체라고합니다. 실행할 스레드의 내용이 포함되어 있습니다. 실행 메소드가 종료되고 스레드가 즉시 종료됩니다.
시작 방법은 스레드를 시작하는 메소드입니다. 그것을 사용하면 Java는 실행중인 메소드를 실행하기 위해 새 스레드를 만듭니다. 다음은 작은 데모입니다.
for (int i = 0; i <3; i ++) {thread t = new Three (new runnable () {@override public void run () {System.out.println (thread.currentThread (). getName ()+"시작"); {strule.sleep (1000);} catch (e.pruptedexception e) {e.printctrace (); system.out.println (ride.currentthread (). getName ()+"end"); t.start (); } system.out.println ( "Over"); 실행 결과 :
끝났습니다
스레드 -1 시작
스레드 -0 시작
스레드 -2 시작
스레드 -0 끝
스레드 -1 종료
스레드 -2 종료
멀티 스레딩은 무작위이므로 결과는 매번 다를 수 있으며, 이는 우리가주의를 기울여야 할 것입니다. 실행 순서와 스레드의 호출 순서는 일관성이 없습니다.
달리다()
런 메소드는 스레드별로 설정 가능한 실행 방법을 호출하고 위의 데모를 수정하는 것입니다.
for (int i = 0; i <3; i ++) {thread t = new Three (new runnable () {@override public void run () {System.out.println (thread.currentThread (). getName ()+"시작"); {strule.sleep (1000);} catch (e.pruptedexception e) {e.printctrace (); system.out.println (ride.currentthread (). getName ()+"end"); t.run (); } system.out.println ( "Over"); 실행 결과 :
메인 시작
메인 엔드
메인 시작
메인 엔드
메인 시작
메인 엔드
끝났습니다
실행 방법의 직접 결과는 처음과 매우 다릅니다. 순서대로 실행되며 새 스레드를 열지 않습니다.
멈추다()
정지 방법은 스레드의 실행을 강제로 멈추는 것입니다. 안전하지 않으므로이 방법을 사용하지 마십시오. 정지가 호출되면 잠긴 자원이 릴리스되지만이 릴리스는 일관성이 없으며 프로그램 문제를 쉽게 유발할 수 있습니다. 스레드의 정지를 제어하려면 사용자 정의 변수를 사용하여 판단하거나 중단 된 방법 () 메소드를 사용할 수 있습니다.
클래스 스레드 1은 스레드를 확장 {@override public void run () {// 스레드 본체가 실행 중인지 판단합니다 (! isterrupted ()) {// do do}}} 방해하다()
인터럽트의 기능은 스레드에 중단 된 스레드를 알리는 것이지만 특정 인터럽트 실행에는 스레드의 사용자 정의 처리가 필요하며이를 무시하고 계속 실행할 수도 있습니다. 구체적인 외로움은 조인, 대기 및 수면 방법을 실행할 때 중단 된 외과를 던지는 것입니다.
THREAT T1 = NEW THREA (new Runnable () {@Override public void run () {system.out.println (ride.currentThread (). getName ()+"start"); try (int i = 0; i <100000; i ++) {system.out.println (i+""; thread (1); System.out.println ( "스레드가 중단되었습니다"; // 리소스 릴리스, 로깅 등을 수행 할 수 있습니다. e.printstacktrace (); t1.start (); Thread.sleep (100); t1.interrupt ();실행 결과 :
65666768 스레드는 중단 된 Java.lang.linterruptedException : java.lang.sle.slee.sleep (기본 메소드)에서 수면 중단 된 제목 -0.test $ 1.run (test.java:23)의 java.lang.run (Thread.java:745).
isleratrupted ()
스레드가 중단되는지 여부를 확인하기 위해 위의 인터럽트 방법을 실행 한 후에는 true가 반환됩니다.
setPriority (int newPriority) 및 getPriority ()
스레드의 우선 순위를 설정하고 스레드의 우선 순위를 얻으십시오. CPU가 할당 한 리소스는 우선 순위가 높은 스레드에 중점을 둡니다.
스레드 t1 = new Thread (new Runnable () {@override public void run () {long t = system.currentTimeMillis (); System.out.println (thread.currentThread (). getName ()+"start"); for (int i = 0; i <1000; i ++) {thread (1); 자동 생성 된 캐치 블록 E.printstacktrace ()} system.out.println (thread.currentthread ()+"t1 end"+(System.currentTimeMillis ()}}); THREAT T2 = NEW THREA (new Runnable () {@Override public void run () {long t = system.currentTimeMillis (); System.out.println (thread.currentThread (). getName ()+"start"); (int i = 0; i <1000; i ++) {thread {streec (1); 자동 생성 된 캐치 블록 E.printstacktrace ()} system.out.println (thread.currentThread ()+"t2 end"+(System.CurrentTimeMillis ()}}); T1. 세트 프리 리티 (10); T2. 세트 - 사전 (1); t2.start (); t1.start ();실행 결과 :
스레드 -0 startthread-1 startthread-0 t1 end 1357thread-1 t2 end 1371
우선 순위가 동일하면 T1과 T2가 거의 동시에 완료되며 우선 순위가 다를 때 명백한 차이가 있습니다.
getName ()
비교적 간단합니다. 스레드의 이름을 얻으십시오.
가입 () 및 가입 (Long Millis)
Jion 방법의 기능은 스레드 실행이 완료 될 때까지 대기하고 (Long Millis) 가입이 최대 대기 시간을 설정할 수 있습니다. 예를 들어, 메인 스레드는 자식 스레드가 계속 실행되기 전에 자식 스레드의 결과를 완료하고 얻을 때까지 기다려야합니다. 현재 조인 메소드를 사용할 수 있습니다.
스레드 t1 = new Thread (new Runnable () {@override public void run () {long t = system.currentTimeMillis (); system.out.println (thread.currentThread (). getName ()+"시작"); {swor } system.out.println (thread.currentThread (). getName ()+"t1 end"+(System.CurrentTimeMillis ()-t)); t1.start (); t1.join (); System.out.println ( "실행하기 전에 T1이 실행되기를 기다리는 중");실행 결과 :
Thread-0 Startthread-0 T1 End 1001 실행하기 전에 T1이 실행될 때까지 기다립니다.
요약
위의 내용은 Java Multi-Shreaded 스레드의 구현 방법 코드에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오.