자바 BlockingQueue 차단 대기 열 판 다 중 스 레 드 소비 생산 인 스 턴 스

더 읽 기
BlockingQueue 는 차단 대기 열 입 니 다. 그 실현 형식 은 여러 가지 가 있 습 니 다. 고정 적 이 고 링크 등 이 있 습 니 다.메커니즘 은 모두 같 습 니 다. 들 어 오 는 스 레 드 를 대기 시 킵 니 다.
 
다음은 BlockingQueue 가 대기 열 판 다 중 스 레 드 소비 생산 인 스 턴 스 를 차단 합 니 다.
 
public class Fetcher implements Runnable {
	
	private BlockingQueue queue = null;
	
	public Fetcher(BlockingQueue queue)
	{
		this.queue = queue;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try
		{
			int i=0;
			/*while(true)
			{*/
			for(i=0;i<5;i++)
			{
				queue.put("segment-name-"+i);
				System.out.println("ThreadName : "+Thread.currentThread().getName()+"    ");
				
			}
			Thread.sleep(50000);
			int j=0;
			for(j=0;j<25;j++)
			{
				queue.put("segment-name-"+(j+i));
				System.out.println("ThreadName : "+Thread.currentThread().getName()+"    ");
			}
			System.out.println(Thread.currentThread().getName()+"thread--------"+(i+j));
		}
		catch (InterruptedException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	

}

 
   생산자
 
 
 
public class Indexer implements Runnable {

	private BlockingQueue queue;
	public Indexer(BlockingQueue queue)
	{
		this.queue = queue;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try{
			/*while(true)
			{*/
			int i;
			for(i=0;i<10;i++)
			{
				Thread.sleep(1000);
				String name = queue.take();
				System.out.println("ThreadName : " +Thread.currentThread().getName()+ "        " +name);  
			}
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}

}

   소비자
 
 
package com.test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestConsumer {
	
	private static BlockingQueue queue = new ArrayBlockingQueue(10);

	public static void main(String[] args)
	{
		ExecutorService service = Executors.newCachedThreadPool();
		
		Fetcher producer = new Fetcher(queue);
		Indexer consumer = new Indexer(queue);
		Indexer consumerSecond = new Indexer(queue);
		service.submit(producer);
		service.submit(consumer);
		service.submit(consumerSecond);
		
		try{
			Thread.sleep(5000);
		}
		catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

   주 함수
 
 

좋은 웹페이지 즐겨찾기