이 기사에서는 주로 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'm Main线程"); } /* 运行结果为: Start Progress. Thread11线程 : 0 Thread11线程 : 1 Thread11线程 : 2 Thread11线程 : 3 Thread11线程 : 4 End Progress. hi,I'm Main线程 */
요약
위 내용은 Java의 다중 스레드 차단 및 깨우기용 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!