学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信

时间:2023-02-07 18:19:46

今天看了《传智播客_张孝祥_Java多线程与并发库高级应用视频教程》之一,觉得使用BlockingQueue阻塞队列来模拟两个线程之间的通信这个东西很有意思,因为它使用了

BlockingQueue阻塞队列中的put(E o)

void put(E o)
将指定元素添加到此队列中,如果没有可用空间,将一直等待(如果有必要)。

和take()

E take()
检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。
这两个方法的特点来实现阻塞和等待的效果。废话不多说,看示例就明白了(示例是参照视频教程里面的,,不改动)

package cn.yang.thread;

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

public class BlockingQueueCommunication {

	/**
	 * 两个线程之间的通信,使用队列的阻塞功能,见queue1和queue2的使用
	 * @param args
	 */
	public static void main(String[] args) {
		
		final Business business = new Business();
		new Thread(
				new Runnable() {
					
					public void run() {
					
						for(int i=1;i<=50;i++){
							business.sub(i);
						}
						
					}
				}
		).start();
		
		for(int i=1;i<=50;i++){
			business.main(i);
		}
		
	}

	static class Business {
		BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
		BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
		//匿名构造方法
		{
			try {
				queue2.put(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		  public  void sub(int i){
			 try {
				queue1.put(1);
				for(int j=1;j<=10;j++){
					System.out.println("sub thread sequence of " + j + ",loop of " + i);
				}
				queue2.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		  }
		  
		  public  void main(int i){
			 try {
					queue2.put(1);
					for(int j=1;j<=100;j++){
						System.out.println("main thread sequence of " + j + ",loop of " + i);
				}
					queue1.take();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
					
	  }
	
	}
}

运行效果是:

sub thread sequence of 1,loop of 1
sub thread sequence of 2,loop of 1
sub thread sequence of 3,loop of 1

*

*

*

sub thread sequence of 10,loop of 1
main thread sequence of 1,loop of 1
main thread sequence of 2,loop of 1
main thread sequence of 3,loop of 1

*

*

*

main thread sequence of 99,loop of 1
main thread sequence of 100,loop of 1
sub thread sequence of 1,loop of 2
sub thread sequence of 2,loop of 2
sub thread sequence of 3,loop of 2

*

*

*

sub thread sequence of 10,loop of 2
main thread sequence of 1,loop of 2
main thread sequence of 2,loop of 2

*

*

*

也就是sub(int )与main(int)方法交替执行。

so!The  End!

清明前后家家雨咯,看来今天又去不了运动场了

加油!!!!!

2012.4.7