Java线程

  • 格式:doc
  • 大小:63.00 KB
  • 文档页数:14

Java程序设计_作业四专业:计算机科学与技术专业学号:姓名:2014年12月9日作业四线程技术使用作业内容:设计一个生产者-消费者线程:一个字符生产者(Producer) 向一个堆栈(SyncStack) 中加入字符产品,一个字符消费者(Consumer) 向同一个堆栈中取出产品。

要求:当两个线程竞争共享资源—堆栈(SyncStack) 时,通过线程同步以保护共享资源;并且通过线程通信使二者协调完成工作。

例如当堆栈为空时消费者无法取出产品,应先通知生产者加入产品;当堆栈已满时生产者无法继续加入产品,应先通知消费者取出产品。

SyncTest类:提供程序入口main()方法,负责创建生产者和消费者线程,并且启动这些线程。

Producer类:生产者线程,通过调用Stack类的push()方法不断向堆栈中加入产品。

Consumer类:消费者线程,通过调用Stack类的pop()方法不断向堆栈中取出产品。

Stack类:堆栈,允许从堆栈中取出或加入产品,要保证push()方法和pop()方法的同步。

1.Consumer类:package com.thread.domain;public class Consumer implements Runnable {private String name;private Stack stack;public Consumer(Stack stack, String name) {super(); = name;this.stack = stack;}public String getName() {return name;}public void setName(String name) { = name;}public Stack getStack() {return stack;}public void setStack(Stack stack) { this.stack = stack;}@Overridepublic void run() {String goods;for (int i = 0; i < 50; i++) {try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}goods = this.stack.pop();System.out.println(this.getName() + " :pop "+ goods + " from "+ this.stack.getName());}}}2.Producer类:package com.thread.domain;public class Producer implements Runnable {private Stack stack;String name;public Producer(Stack stack, String name) {super();this.stack = stack; = name;}public Stack getStack() {return stack;}public void setStack(Stack stack) {this.stack = stack;}public String getName() {return name;}public void setName(String name) { = name;}@Overridepublic void run() {String goods;for (int i = 0; i < 50; i++) {try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}goods = "goods" + (this.stack.getPoint() + 1);stack.push(goods);System.out.println(this.getName() + " :push "+ goods + " to "+ this.stack.getName());// Thread.currentThread().yield();}}}3.Stack类:package com.thread.domain;public class Stack {private String name;private String[] buffer = new String[5];private int point = -1;private boolean flag = false;public synchronized int getPoint() {return point;}public synchronized void setPoint(int point) { this.point = point;}public synchronized String getName() {return name;}public synchronized void setName(String name) { = name;}public synchronized String[] getBuffer() {return buffer;}public synchronized void setBuffer(String[] buffer) { this.buffer = buffer;}public synchronized String pop() {if (!this.flag) {try {super.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}String goods = buffer[point];buffer[point] = null;// Thread.yield();point--;if (this.point == -1) {flag = false;super.notify();}// super.notify() ;return goods;}public synchronized void push(String goods) { if (this.flag) {try {super.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}point++;// Thread.yield();buffer[point] = goods;if (this.point == 4) {flag = true;super.notify();}// super.notify() ;}}4.SyncTest类:package com.thread.test;import com.thread.domain.Consumer;import com.thread.domain.Producer;import com.thread.domain.Stack;public class SyncTest {public static void main(String[] args) {Stack stack = new Stack();stack.setName("stack1");Producer producer = new Producer(stack, "producer1");Consumer consumer = new Consumer(stack, "consumer1");new Thread(producer).start();new Thread(consumer).start();}}运行结果:producer1 :push goods0 to stack1producer1 :push goods1 to stack1producer1 :push goods2 to stack1producer1 :push goods3 to stack1producer1 :push goods4 to stack1consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 producer1 :push goods3 to stack1 consumer1 :pop goods0 from stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 producer1 :push goods4 to stack1 consumer1 :pop goods3 from stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1consumer1 :pop goods1 from stack1 producer1 :push goods3 to stack1 consumer1 :pop goods4 from stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 producer1 :push goods3 to stack1 consumer1 :pop goods3 from stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1producer1 :push goods4 to stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 consumer1 :pop goods4 from stack1 producer1 :push goods3 to stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 consumer1 :pop goods4 from stack1 producer1 :push goods4 to stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 consumer1 :pop goods3 from stack1 producer1 :push goods3 to stack1producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 consumer1 :pop goods3 from stack1 producer1 :push goods4 to stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1 producer1 :push goods3 to stack1 producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 consumer1 :pop goods4 from stack1 producer1 :push goods3 to stack1 producer1 :push goods1 to stack1 producer1 :push goods2 to stack1producer1 :push goods4 to stack1 consumer1 :pop goods4 from stack1 consumer1 :pop goods3 from stack1 consumer1 :pop goods2 from stack1 consumer1 :pop goods1 from stack1 consumer1 :pop goods3 from stack1。