用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

java 堆栈类(生产者消费者 线程同步)

2013-04-05 作者: 海大软件1102班举报

[java]代码库

class SyncStack { // 同步堆栈类
	private int index = 0; // 堆栈指针初始值为0
	private char[] buffer = new char[6]; // 堆栈有6个字符的空间

	public synchronized void push(char c) { // 加上互斥锁
		while (index == buffer.length) { // 堆栈已满,不能压栈
			try {
				this.wait(); // 等待,直到有数据出栈
			} catch (InterruptedException e) {
			}
		}

		this.notify(); // 通知其它线程把数据出栈
		buffer[index] = c; // 数据入栈
		index++; // 指针向上移动
	}

	public synchronized char pop() { // 加上互斥锁
		while (index == 0) { // 堆栈无数据,不能出栈
			try {
				this.wait(); // 等待其它线程把数据入栈
			} catch (InterruptedException e) {
			}
		}

		this.notify(); // 通知其它线程入栈
		index--; // 指针向下移动
		return buffer[index]; // 数据出栈
	}
}

class Producer implements Runnable { // 生产者类
	SyncStack theStack;

	// 生产者类生成的字母都保存到同步堆栈中

	public Producer(SyncStack s) {
		theStack = s;
	}

	public void run() {
		char c;
		for (int i = 0; i < 20; i++) {
			c = (char) (Math.random() * 26 + 'A');
			// 随机产生20个字符
			theStack.push(c); // 把字符入栈
			System.out.println("Produced: " + c); // 打印字符
			try {
				Thread.sleep((int) (Math.random() * 1000));
				/* 每产生一个字符线程就睡眠 */
			} catch (InterruptedException e) {
			}
		}
	}
}

class Consumer implements Runnable { // 消费者类
	SyncStack theStack;

	// 消费者类获得的字符都来自同步堆栈

	public Consumer(SyncStack s) {
		theStack = s;
	}

	public void run() {
		char c;
		for (int i = 0; i < 20; i++) {
			c = theStack.pop(); // 从堆栈中读取字符
			System.out.println("Consumed: " + c);
			// 打印字符
			try {
				Thread.sleep((int) (Math.random() * 1000));
				/* 每读取一个字符线程就睡眠 */
			} catch (InterruptedException e) {
			}
		}
	}
}

public class SyncTest {
	public static void main(String args[]) {
		SyncStack stack = new SyncStack();
		// 下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象
		Runnable source = new Producer(stack);
		Runnable sink = new Consumer(stack);
		Thread t1 = new Thread(source); // 线程实例化
		Thread t2 = new Thread(sink); // 线程实例化
		t1.start(); // 线程启动
		t2.start(); // 线程启动
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...