Java 다중 스레드 인스턴스 상세 정보 (2)

6153 단어 Java다중 스레드
본고는 이전 문장인 을 이어받았다.
사.Java 다중 스레드의 차단 상태와 스레드 제어
위에서 언급한 Java 장애의 몇 가지 구체적인 유형은다음은 Java 스레드가 막히는 주요 방법입니다.
1.join()
join - 한 라인이 다른 라인이 완성되기를 기다려야만 계속 실행할 수 있습니다.만약에 A 라인 실행체에서 B 라인의join () 방법을 호출하면 A 라인이 막히고 B 라인이 실행될 때까지 A가 계속 실행될 수 있음을 알 수 있다.

public class ThreadTest {

 public static void main(String[] args) {

 MyRunnable myRunnable = new MyRunnable();
 Thread thread = new Thread(myRunnable);

 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
  if (i == 30) {
  thread.start();
  try {
   thread.join(); // main thread 
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
 }
 }
}

class MyRunnable implements Runnable {

 @Override
 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
 }
 }
}
2.sleep()
sleep - 현재 실행 중인 라인을 지정한 시간을 멈추고 막힌 상태로 들어갑니다.수면 시간 내에 이 라인은 준비 상태가 아니기 때문에 실행할 기회를 얻지 못한다.이 때 시스템에 실행 가능한 라인이 없더라도sleep () 의 라인은 실행되지 않습니다.따라서sleep () 방법은 라인 실행을 멈추는 데 자주 사용됩니다.
앞에서 말한 바와 같이 새 라인의 start () 방법을 호출한 후에 라인이 준비 상태로 들어가면 다음 시간에 CPU 타임 슬라이드가 실행될 수 있습니다. 이 새로운 라인의 필연적인 즉각 실행을 원한다면 원래 라인의 sleep (1) 를 직접 호출하면 됩니다.

public class ThreadTest {

 public static void main(String[] args) {

 MyRunnable myRunnable = new MyRunnable();
 Thread thread = new Thread(myRunnable);

 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
  if (i == 30) {
  thread.start();
  try {
   Thread.sleep(1); //  thread 
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  }
 }
 }
}

class MyRunnable implements Runnable {

 @Override
 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println(Thread.currentThread().getName() + " " + i);
 }
 }
}
주: CPU가 비어 있지 않기 때문에 새 라인으로 전환됩니다.
3. 백그라운드 스레드(Daemon Thread)
개념/목적: 백그라운드 라인은 주로 다른 라인(상대적으로 프런트 라인이라고 할 수 있음)에 서비스를 제공하거나'수호 라인'이다.JVM의 쓰레기 수거 라인과 같습니다.
생명주기: 백그라운드 라인의 생명주기는 프론트 라인의 생명주기와 일정한 관련이 있다.주로 다음과 같다. 모든 프론트 라인이 사망 상태에 들어갈 때 프론트 라인은 자동으로 죽는다. (사실 이것도 이해하기 쉽다. 왜냐하면 프론트 라인이 존재하는 목적은 프론트 라인을 위해 서비스하는 것이기 때문이다. 모든 프론트 라인이 죽었으니 그 자체가 남겨두면 무슨 소용이 있겠는가... 위대하다!).
백그라운드 스레드 설정:Thread 대상의 setDaemon(true) 방법을 호출하면 지정한 스레드를 백그라운드 스레드로 설정할 수 있습니다.

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread = new MyThread();
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread.setDaemon(true);
  myThread.start();
  }
 }
 }

}

class MyThread extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("i = " + i);
  try {
  Thread.sleep(1);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 }
}
스레드가 백그라운드 스레드인지 판단:thread 대상의 isDeamon () 방법을 호출합니다.
주:main 라인은 기본적으로 프론트 라인이고, 프론트 라인 창설에서 만든 하위 라인은 기본적으로 프론트 라인이며, 프론트 라인에서 만든 라인은 기본적으로 프론트 라인입니다.setDeamon(true) 방법을 호출하여 프론트 라인을 백엔드 라인으로 설정할 때 start() 방법을 호출하기 전에 해야 합니다.그저께 라인이 모두 사망한 후, JVM은 백그라운드 라인이 사망했다고 통지하였으나, 지령을 받고 응답하기까지 일정한 시간이 소요되었다.
4. 스레드의 우선 순위/SetPriority 변경():
모든 스레드는 실행할 때 일정한 우선순위를 가지고 우선순위가 높은 스레드는 비교적 많은 실행 기회를 가진다.모든 스레드의 기본 우선 순위는 생성된 스레드의 우선 순위와 같습니다.main 루틴은 기본적으로 일반적인 우선순위를 가지고 있습니다.
스레드 우선 순위 설정: setPriority(int priorityLevel).매개변수 priority Level 범위는 1-10 사이이며 다음과 같은 세 가지 정적 상수 값을 사용합니다.
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
스레드 우선 순위 가져오기: getPriority ()
주: 비교적 높은 스레드 우선순위를 가진 스레드 대상은 이 스레드가 우선순위가 아니라 비교적 많은 실행 기회를 가지고 있음을 나타낸다.

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread = new MyThread();
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread.setPriority(Thread.MAX_PRIORITY);
  myThread.start();
  }
 }
 }

}

class MyThread extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("i = " + i);
 }
 }
}
5. 스레드 양보: yield ()
이전 블로그에서 yield()의 기본적인 역할을 설명했고 yield() 방법은 루트 우선순위와 관련이 있다. 어떤 루트가 yiled() 방법을 실행 상태에서 준비 상태로 바꾸면 CPU는 준비 상태 루트 대기열에서 이 루트 우선순위와 같거나 우선순위가 높은 루트만 선택하여 실행한다.

public class ThreadTest {

 public static void main(String[] args) {
 Thread myThread1 = new MyThread1();
 Thread myThread2 = new MyThread2();
 myThread1.setPriority(Thread.MAX_PRIORITY);
 myThread2.setPriority(Thread.MIN_PRIORITY);
 for (int i = 0; i < 100; i++) {
  System.out.println("main thread i = " + i);
  if (i == 20) {
  myThread1.start();
  myThread2.start();
  Thread.yield();
  }
 }
 }

}

class MyThread1 extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("myThread 1 -- i = " + i);
 }
 }
}

class MyThread2 extends Thread {

 public void run() {
 for (int i = 0; i < 100; i++) {
  System.out.println("myThread 2 -- i = " + i);
 }
 }
}
시리즈:
j ava 다중 루틴 실례 설명 (1)
Java 다중 스레드 인스턴스 상세 정보 (2)
Java 멀티스레드 인스턴스 상세(3)

좋은 웹페이지 즐겨찾기