1. 스레드의 우선 순위
스레드 우선 순위 사용의 예 :
PACKED CN.GALC.TEST; PUBLIC CLASS TESTTHREAD6 {public static void main (String Args []) {Mythread4 T4 = New Mythread4 (); Mythread5 T5 = New Mythread5 (); 스레드 T1 = 새 스레드 (T4); 스레드 T2 = 새 스레드 (T5); t1.setpriority (thread.norm_priority + 3); // setPriority () 메소드를 사용하여 스레드의 우선 순위를 설정하므로 여기서는 T1 스레드의 우선 순위가 설정됩니다. t1.start (); t2.start (); System.out.println ( "T1 스레드의 우선 순위는" + t1.getPriority ()); // getPriority () 메소드를 사용하여 스레드의 우선 순위를 얻고 T1의 우선 순위를 8}} 클래스 MythRead4는 runnable {public void run () {for (int i = 0; i <= 1000; i ++) {System.out.println ( "t1 :"+i); }}} class mythread5는 runnable {public void run () {for (int i = 0; i <= 1000; i ++) {system.out.println ( "=================== T2 :"+i); }}} run () 메소드가 끝나 자마자 스레드가 끝납니다.2. 스레드 동기화
동기화 된 키워드 사용의 예 :
패키지 cn.galc.test; public class testync emplements runnable {타이머 타이머 = new Timer (); public static void main (String Args []) {testsync test = new testsync (); 스레드 T1 = 새 스레드 (테스트); 스레드 T2 = 새 스레드 (테스트); t1.setname ( "t1"); // t1 스레드의 이름을 설정하십시오 t2.setname ( "t2"); // t2 스레드 t1.start ()의 이름을 설정합니다. t2.start (); } public void run () {timer.add (Thread.currentThread (). getName ()); }} 클래스 타이머 {private static int num = 0; public/ * synchronized */void add (문자열 이름) {// 메소드를 선언 할 때 동기화 할 때이 메소드를 실행하는 동안 현재 객체가 잠겨 있음을 의미합니다. {/ * * 동일한 객체 자원에 액세스하는 두 스레드에 대한 문제가 없을 것입니다. 하나의 스레드에 액세스 할 때만 다음 스레드가 액세스 할 차례입니다 */ num ++; try {thread.sleep (1); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println (name + ": 당신은"타이머를 사용하는 " + num +"스레드입니다.); }}} 스레드 교착 상태 문제 :
패키지 cn.galc.test;/*이 애플릿은 스레드 교착 상태의 문제를 시뮬레이션합니다*/public class testdeadlock emplements runnable {public int flag = 1; 정적 객체 o1 = new Object (), o2 = new Object (); public void run () {system.out.println (thread.currentthread (). getName () + "flag =" + flag); /** 프로그램을 실행 한 후 프로그램이 실행되어 플래그를 인쇄한다는 것을 알았으며, 후속 IF 문을 다시 실행하지 않을 것입니다. } catch (InterruptedException e) {e.printstacktrace (); } 동기화 된 (O2) { /** Object O1은 O2를 잠글 수있는 한 1* 인쇄 작업을 실행할 수있는 한, 개체 O2가 다른 스레드 플래그에 잠겨 있었기 때문에 객체 O2를 잠그었기 때문에 O1 O2가 잠글 수있는 스레드가 잠을 자지 않기 때문에 O1 O2를 잠글 수 없습니다. }}}} /** 두 스레드의 문제가 발생했기 때문에 실행되지 않으면 실행되지 않습니다.* 플래그 = 1 플래그 = 0이 스레드는 객체 o2의 잠금을 잠금 해제하고 있습니다. 스레드 플래그 = 0*/ if (flag == 0) {synchronized (o2) {/*여기서 동기화 된 객체를 잠그기 먼저 O2를 잠그십시오*/ try {thread.sleep (500); } catch (InterruptedException e) {e.printstacktrace (); } 동기화 (O1) { / * * Object O2가 이전에 잠겨 있습니다. O1을 잠글 수있는 한 0 인쇄 0의 작동을 수행 할 수 있습니다. 그러나 객체 O1이 플래그 = 1의 다른 스레드에 잠겨 있었기 때문에 객체 O1은 여기에 잠글 수 없습니다. 물체를 잠그는 스레드 O1은 500 밀리 초마다 잠을 자지 만, 수면*/ system.out.println ( "0")에서는 여전히 O1을 잠금합니다. }}}} public static void main (String args []) {testDeadLock td1 = new TestDeadLock (); TestDeadLock TD2 = New TestDeadLock (); td1.flag = 1; td2.flag = 0; 스레드 T1 = 새 스레드 (TD1); 스레드 T2 = 새 스레드 (TD2); t1.setname ( "스레드 td1"); t2. 세트 이름 ( "스레드 td2"); t1.start (); t2.start (); }}스레드 교착 문제를 동시에 두 개가 아닌 하나의 객체 만 해결하는 것이 가장 좋습니다.
생산자 및 소비자 질문 :
패키지 CN.GALC.TEST;/* 예제 이름 : 프로듀서 이름-소비자 문제* 소스 파일 이름 : ProduceRconsumer.java* 키 포인트 :* 1. 공유 데이터의 불일치/중요 리소스 보호* 2. Java 객체 잠금의 개념* 3. 동기화 된 키워드/대기 () 및 공공 ClasseConsumer {public classeRconsumer {) {public classconsumer {). stack = new SyncStack (); 런닝 가능한 p = 새로운 생산자 (스택); 실행 가능한 c = 새로운 소비자 (스택); 스레드 P1 = 새 스레드 (P); 스레드 C1 = 새 스레드 (C); p1.start (); c1.start (); }} class syncstack {// 멀티 스레드 동기화 작업을 지원하는 스택의 구현 private int index = 0; 개인 char [] data = new char [6]; public synchronized void push (char c) {if (index == data.length) {try {this.wait (); } catch (InterruptedException e) {}} this.notify (); 데이터 [index] = c; 색인 ++; } public synchronized char pop () {if (index == 0) {try {this.wait (); } catch (InterruptedException e) {}} this.notify (); 색인--; 반환 데이터 [색인]; }} 클래스 프로듀서는 런닝 가능한 {SyncStack 스택; 공개 프로듀서 (syncstack s) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = (char) (math.random ()*26+'a'); stack.push (c); System.out.println ( "생산 :"+C); try {thread.sleep ((int) (math.random ()*1000)); } catch (InterruptedException e) {}}}} 클래스 소비자 구현 런닝 가능 {syncstack 스택; 공개 소비자 (syncstack s) {stack = s; } public void run () {for (int i = 0; i <20; i ++) {char c = stack.pop (); System.out.println ( "소비 :"+C); try {thread.sleep ((int) (math.random ()*1000)); } catch (InterruptedException e) {}}}}위는 Java 스레드에 대한 전체 소개입니다. 첫 번째 기사 "Java는 당신을 도울 수 있기를 바라면서 배우기 위해"Java가 학습하고 배워야합니다 (1) "을 결합 할 수 있습니다.