>  기사  >  Java  >  Java의 다중 스레드 차단 및 깨우기용 샘플 코드

Java의 다중 스레드 차단 및 깨우기용 샘플 코드

黄舟
黄舟원래의
2017-09-29 10:05:551652검색

이 기사에서는 주로 Java 멀티스레딩의 차단 및 깨우기에 대한 관련 내용을 공유합니다. 이 기사를 통해 스레드 차단 상태 및 실행 가능 상태에 들어가는 방법을 대략적으로 이해할 수 있습니다.

Java 스레드 차단 및 깨우기

1.sleep() 메서드:

sleep(...밀리초), 이 시간 내에 스레드가 스레드 차단 상태에 들어가도록 시간을 밀리초 단위로 지정합니다. , 이 기간 동안 CPU 타임 슬라이스를 얻지 못하고 시간이 지나면 스레드는 실행 가능 상태로 다시 들어갑니다. (스레드를 일시 중지하면 잠금이 해제되지 않습니다.)


//测试sleep()方法
class Thread7 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<50;i++){
      System.out.println(Thread.currentThread().getName()+"num="+i);
      try {
        Thread.sleep(500);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
class Thread8 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<1000;i++){
      System.out.println(Thread.currentThread().getName()+"num="+i);
    }
  }
}
public static void main(String[] args) {
    /*
     * 测试线程阻塞
     */
    //测试sleep()方法
    Thread7 t7=new Thread7();
    Thread8 t8=new Thread8();
    Thread t81=new Thread(t8, "饺子");
    Thread t71=new Thread(t7, "包子");
    Thread t72=new Thread(t7, "面包");
    t71.start();
    t81.start();
    t72.start();
  }

2.suspens() 및 이력서() 메소드:.

스레드 일시 중지 및 깨우기 suspend()는 해당 스레드를 차단 상태로 전환합니다. 해당 이력서()가 호출될 때만 스레드는 실행 가능 상태로 들어갑니다. (권장하지 않음, 교착 상태가 발생하기 쉬움)


//测试suspend()和resume()方法
class Thread9 implements Runnable{
  @Override
  public void run() {
    for(long i=0;i<500000000;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
    }
  }
}
public static void main(String[] args) {
  //测试suspend和resume
    Thread9 t9=new Thread9();
    Thread t91=new Thread(t9,"包子");
    t91.start();
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    t91.suspend();
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    t91.resume();
}

(콘솔이 출력을 인쇄할 때 2초 동안 일시 중지한 후 인쇄를 계속합니다.)

3.yield() 메서드:

이렇게 하면 스레드가 현재 할당된 CPU 시간 조각을 포기하게 되지만 이때 스레드는 여전히 실행 가능 상태에 있으므로 언제든지 CPU 시간 조각을 다시 할당할 수 있습니다. Yield() 메소드는 동일한 우선순위의 스레드에게만 실행 기회를 줄 수 있습니다. Yield() 호출의 효과는 스레드가 다른 스레드로 이동할 만큼 충분한 시간을 실행했다고 간주하는 스케줄러와 동일합니다. (현재 실행 중인 스레드를 일시정지하고 다른 스레드를 실행하며, 주어진 시간은 알 수 없음)


//测试yield()方法
class Thread10 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" num= "+i);
      if(i==33){
        Thread.yield();
      }
    }
  }
}

public static void main(String[] args) {
  //测试yield
    Thread10 t10 =new Thread10();
    Thread t101=new Thread(t10, "包子");
    Thread t102=new Thread(t10, "面包");
    t101.start();
    t102.start();
}
/*
运行结果为:
……
包子 num= 24
包子 num= 25
包子 num= 26
包子 num= 27
包子 num= 28
包子 num= 29
包子 num= 30
包子 num= 31
包子 num= 32
包子 num= 33
面包 num= 0
面包 num= 1
面包 num= 2
面包 num= 3
……
面包 num= 30
面包 num= 31
面包 num= 32
面包 num= 33
包子 num= 34
包子 num= 35
包子 num= 36
包子 num= 37
包子 num= 38
……
*/

(숫자가 33이면 교번이 발생한 것을 알 수 있습니다.)

4. 및 통지() 메소드:

두 메소드는 함께 사용됩니다. wait()는 스레드를 차단 상태로 만듭니다. 통지()가 호출되면 스레드는 실행 가능 상태로 들어갑니다. wait()에서는 매개변수를 추가하거나 추가하지 않을 수 있다. 매개변수 추가 시 단위는 밀리세컨드(millisecond)이다. (Thread 클래스가 아닌 Object 클래스에 속하므로 wait()는 잠긴 객체를 먼저 해제한 후 대기 동작을 수행한다. wait()가 기다린 객체를 먼저 잠궈야 하므로 동기화에만 사용할 수 있다. .프로그램 세그먼트 또는 동기화된 메서드, 그렇지 않으면 IllegalMonitorStateException이 발생합니다.)


//测试wait()和notify()方法
//用生产者和消费者模式模拟这一过程
/*消费者 */
class Consumer implements Runnable {
private Vector obj;
  public Consumer(Vector v) {
    this.obj = v;
  }
  public void run() {
    synchronized (obj) {
      while (true) {
        try {
          if (obj.size() == 0) {
            obj.wait();
          }
          System.out.println("消费者:我要买面包。");
          System.out.println("面包数: " + obj.size());
          obj.clear();
          obj.notify();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
}
/* 生产者 */
class Producter implements Runnable {
  private Vector obj;
  public Producter(Vector v) {
    this.obj = v;
  }
  public void run() {
    synchronized (obj) {
      while (true) {
        try {
          if (obj.size() != 0) {
            obj.wait();
          }
          obj.add(new String("面包"));
          obj.notify();
          System.out.println("生产者:面包做好了。");
          Thread.sleep(500);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
}
public static void main(String[] args) {
  //测试wait()和notify()
    Vector obj = new Vector();
    Thread consumer = new Thread(new Consumer(obj));
    Thread producter = new Thread(new Producter(obj));
    consumer.start();
    producter.start();
}

5 Join() 메서드

는 스레드 조인이라고도 합니다. 현재 스레드 A는 다른 스레드 B의 Join() 메서드를 호출합니다. 현재 스레드 A는 스레드 B가 실행을 완료할 때까지 스레드 A가 차단 상태에서 실행 가능 상태로 변경되지 않습니다.


//测试join
class Thread11 implements Runnable{
  @Override
  public void run() {
    System.out.println("Start Progress.");
    try {
      for(int i=0;i<5;i++){
        System.out.println("Thread11线程 : "+i);
        Thread.sleep(1000);
      }
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    System.out.println("End Progress.");
  }
}
public static void main(String[] args) {
  //测试join
    Thread11 t11=new Thread11();
    Thread t111=new Thread(t11);
    t111.start();
    try {
      t111.join();
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    System.out.println("hi,I&#39;m Main线程");
}
/*
运行结果为:
Start Progress.
Thread11线程 : 0
Thread11线程 : 1
Thread11线程 : 2
Thread11线程 : 3
Thread11线程 : 4
End Progress.
hi,I&#39;m Main线程
*/

요약

위 내용은 Java의 다중 스레드 차단 및 깨우기용 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.