synchronized는 쓰레드를 동시에 사용할 때 동시에 임계영역에 들어오지 못하도록 할 수 있다.
1. wait()
- 쓰레드 기다려!
2. notify() / notifyAll()
- 쓰레드 가자! 일어나! 산책가자
예제) 생산자와 소비자
생산자 쓰레드가 데이터를 저장한 후 소비자 쓰레드가 데이터를 꺼낼 수 있다 ,
생산자 쓰레드는 소비자 쓰레드가 버퍼에서 데이터를 가져가지 않았으면 데이터를 버퍼에 저장할 수 없고 wait()
풀이
1. 생산자 쓰레드와 소비자 쓰레드를 공동 저장할 수 있는 버퍼를 제작하자
Buffer.java
public class Buffer {
int data = 0;
boolean available = false;
public synchronized int get() { // 소비자
while(available==false) {
try {
wait();
}
catch(Exception e) {}
}
available= false;
notifyAll();
return data;
}
public synchronized int put(int num) { //생산자
while(available==true) {
try {
wait();
}
catch(Exception e) {}
}
data = num;
available= true;
notifyAll();
return data;
}
}
2. 소비자
Consumer.java
import java.util.Random;
public class Consumer extends Thread {
Buffer dataBuffer;
public Consumer(Buffer b) {
dataBuffer = b;
}
public void run() {
Random r = new Random();
for(int i = 0; i<5;i++) {
int num = dataBuffer.get();
System.out.println("소비자 : " +num);
try {
sleep(Math.abs(r.nextInt()%100));//대기대기
}catch(Exception e){}
}
}
}
3. 생산자
import java.util.Random;
public class Producer extends Thread {
Buffer dataBuffer;
public Producer(Buffer b) {
dataBuffer = b;
}
public void run() {
Random r = new Random();
for(int i = 0; i<5;i++) {
dataBuffer.put(i);
System.out.println("생산자 : " +i);
try {
sleep(Math.abs(r.nextInt()%100));//대기대기
}catch(Exception e){}
}
}
}
4.
쓰레드 시작
public class ProducerConsumer {
public static void main(String[] args) {
Buffer b= new Buffer();
Producer p = new Producer(b);
p.start();
Consumer c= new Consumer(b);
c.start();
}
}
'[JAVA]' 카테고리의 다른 글
Abstraction + @ (추상화와 그 외의 중요한 것들) (0) | 2023.01.17 |
---|---|
NullPointerException (0) | 2022.12.22 |
discord로 IntelliJ하는거 티내는 방법 (0) | 2022.12.21 |
java char to int (0) | 2022.12.21 |
JAVA EOF (scanner + buffered reader) (0) | 2022.11.02 |