โ BlockingQueue
- ํ๊ฐ ๊ฝ ์ฐผ์ ๋ Object๋ฅผ ์ฝ์ ํ๋ ค๊ณ ํ ๋๋ ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง waitํ๊ณ ,
ํ๊ฐ ๋น์์ ๋ Object๋ฅผ ๊บผ๋ด๋ ค๊ณ ํ ๋๋ ํ์ ์๋ก์ด Object๊ฐ ์ฝ์ ๋ ๋๊น์ง waitํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ ํ์ด๋ค.
- Thread-safeํ๋ค.
- ์ฒ์์๋ Producer-Consumer Queue๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋ง๋ค์ด์ก๋ค๊ณ ํ๋ค.
โ BlockingQueue Methods
- BlockingQueue์ ๋ฉ์๋๋ค์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๋์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅํ ์ ์๋ค.
Throws Exception | Special value | Blocks | Times out | |
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(time, unit) |
Examine | element() | peek() | - | - |
- Throws Exception : ์์ธ ๋ฐ์์ Exception์ ๋์ง๋ค
- Special value : ์์ธ ๋ฐ์์ ํน์ ๊ฐ(null์ด๋ false)์ ๋ฐํํ๋ค.
- Blocks : ์์ธ ๋ฐ์์ waitํ๋ค.
- Times out : ์์ธ ๋ฐ์์(์์ ์ ๋น์ฅ ์ํํ ์ ์์ผ๋ฉด) waitํ๋ค. ์ง์ ํ time limit ๋ด์ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ฉด ์ํ ํ true๋ฅผ ๋ฆฌํดํ๊ณ , timeout๋๋ฉด false๋ฅผ ๋ฆฌํดํ๋ค.
- ๊ฐ ๋ฉ์๋์ ๋ํ ์์ธํ ์ค๋ช ์ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
โ Producer-Consumer problem ํด๊ฒฐ
์ฌ๋ฌ ๊ฐ์ Producer ์ค๋ ๋์, ์ฌ๋ฌ ๊ฐ์ Consumer ์ค๋ ๋๋ฅผ ์คํํ ๋,
BlockingQueue๋ฅผ ์ด์ฉํ์ฌ ์์ฐ์-์๋น์ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
Java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
public class BlockingQueueEx {
public static void main(String[] args) {
BlockingQueue buffer = new LinkedBlockingQueue();
Producer p1 = new Producer(buffer, "p1");
Producer p2 = new Producer(buffer, "p2");
Consumer c1 = new Consumer(buffer, "c1");
Consumer c2 = new Consumer(buffer, "c2");
new Thread(p1).start();
new Thread(p2).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
class Producer implements Runnable{
Logger logger = Logger.getLogger("logger");
static AtomicInteger i = new AtomicInteger();
private final BlockingQueue queue;
String name;
Producer (BlockingQueue queue, String name){
this.queue = queue;
this.name = name;
}
public int produce() throws InterruptedException {
int data = i.incrementAndGet();
logger.info(String.format("%s ์ด/๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํฉ๋๋ค: %d", name, data));
Thread.sleep(500);
return data;
}
@Override
public void run() {
try{
while(true){
queue.put(produce());
}
} catch (InterruptedException ignore){
}
}
}
class Consumer implements Runnable {
Logger logger = Logger.getLogger("logger");
private final BlockingQueue queue;
String name;
Consumer(BlockingQueue queue, String name){
this.queue = queue;
this.name = name;
}
public void consume(Object target) throws InterruptedException {
logger.info(String.format("%s ์ด/๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋นํฉ๋๋ค: %d " , name, target));
Thread.sleep(500);
}
@Override
public void run(){
try{
while(true){
consume(queue.take());
}
} catch (InterruptedException ignore){
}
}
}
- ์คํ ๊ฒฐ๊ณผ
โ Reference
'๊ฐ์ธ ๊ณต๋ถ > Java, Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Reflection (0) | 2023.11.17 |
---|---|
[Java] equals(), hashCode() (0) | 2023.10.25 |
[Java] Java TCP socket programming (0) | 2023.09.19 |
[Java] ์๋ฐ ๋ก๊น (Logging) (0) | 2023.09.06 |
๊ฐ์ฒด์งํฅ์ ํน์ง (0) | 2023.07.24 |