11 다중 스레드

2532 단어
제목: 두 개의 라인, 그 중 한 라인은 어떤 대상에 대한 int값++ 작업을 완성하고, 다른 라인은 이 대상에 대한 int 형식 - 작업을 수행한다. 동시에 이 대상의 값이 0보다 작지 않고, 1보다 크지 않으며, 이 값의 초기화 값은 0이다.
결과는 0101010101010101010101...
4
package com.test;

public class ThreadTest {

	private int number = 0;

	public synchronized void jia() throws InterruptedException {

		if (number != 0) {
			wait();
		}
		number++;
		System.out.println("jia:"+number);
		notify();

	}

	public synchronized void jian() throws InterruptedException {
		if (number == 0) {
			wait();
		}
		number--;
		System.out.println("jian:"+number);
		notify();
	}

	public static void main(String[] args) {

		ThreadTest tt = new ThreadTest();
		
		Producer p = new Producer(tt);
		Consumer c = new Consumer(tt);
		
		p.start();
		c.start();
		
	}

}

class Producer extends Thread{
	
	ThreadTest tt;
	
	public Producer(ThreadTest tt) {
		this.tt=tt;
	}
	
	@Override
	public void run() {
		while(true){
			try {
				tt.jia();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}


class Consumer extends Thread{
	
	ThreadTest tt;
	
	public Consumer(ThreadTest tt) {
		this.tt=tt;
	}
	
	@Override
	public void run() {
		while(true){
			try {
				tt.jian();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}
출력 결과
jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
jia:1
jian:0
두 개의 라인을 가동하고 두 개의 라인을 가동합니까?
	private int number = 0;

	public synchronized void jia() throws InterruptedException {

		while (number != 0) {
			wait();
		}
		number++;
		System.out.println(Thread.currentThread().getName()+ "  jia:"+number);
		notify();;

	}

	public synchronized void jian() throws InterruptedException {
		while (number == 0) {
			wait();
		}
		number--;
		System.out.println(Thread.currentThread().getName()+ "  jian:"+number);
		notify();
	}

while로 변경하면 자물쇠가 사라질 수 있습니다. 해결 방법은 notify를 notify All로 바꾸는 방법입니다.
wait, notify, notifyAll 및 sleep 방법의 관계(중점)
(1, 만약에 한 라인이 대상의wait 방법을 호출한다면, 이 라인은 먼저 대상의 자물쇠를 가지고 있어야 한다. (한 라인이 대상의wait 방법을 호출한다면 이wait는synchronized에 있어야 한다.)
(2, 만약에 한 라인이 어떤 대상의wait 방법을 호출한다면 이 라인은 그 대상의 자물쇠를 방출할 것이다.
(3,java 대상 중 두 가지 연못이 있다(연못을 잠그고 기다리는 연못)
(4, 만약에 한 라인이 대상의wait 방법을 호출한다면 이 라인이 대상의 대기 탱크에 들어갑니다(자물쇠를 풀다). 만약 미래 어느 순간에 다른 라인이 대상의 notify나 notify All 방법을 호출한다면 이 대기 탱크에서 대기 라인이 대상의 자물쇠에 들어갑니다. 이 대상의 자물쇠를 기다리거나 잠그는 데 성공하면그러면 이 라인은wait 방법 이후의 경로를 따라 계속 실행될 것입니다.
(5,sleep 수면, 잠금 풀지 않음

좋은 웹페이지 즐겨찾기