线程经典代码二,(同步情况下的生产者/消费者关系)
来源:互联网 发布:淘宝店铺优惠如何设置 编辑:程序博客网 时间:2024/05/22 04:41
同步情况下的生产者/消费者关系
//Buffer接口方法
public interface Buffer ...{
public void set(int value);
public int get();
}
//消费者
public class Consumer extends Thread...{
private Buffer sharedLocation;
public Consumer(Buffer shared)
...{
super("Consumer");
sharedLocation = shared;
}
public void run()
...{
int sum=0;
for(int i=1;i<=4;i++)
...{
try...{
Thread.sleep((int)(Math.random() * 3001));
sum = sum + sharedLocation.get();
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}
}
//生产者
public class Product extends Thread...{
private Buffer sharedLocation;
public Product(Buffer shared)
...{
super("Product");
sharedLocation = shared;
}
public void run()
...{
for(int i=1;i<=4;i++)
...{
try...{
Thread.sleep((int)(Math.random() * 3001));
sharedLocation.set(i);
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}
}
//实现对共享数据的同步访问方法
public class SynchronizedBuffer implements Buffer...{
private int buffer = -1;
private int occupiedBufferCount = 0;
public synchronized void set(int value)
...{
String name = Thread.currentThread().getName();
while(occupiedBufferCount == 1)...{
try...{
System.err.println(name + " tries to write.");
displayState( "Buffer full. " + name + "waits.");
wait();
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
buffer = value;
++occupiedBufferCount;
displayState(name + "writes" + buffer);
notify();
}
public synchronized int get() ...{
String name = Thread.currentThread().getName();
while(occupiedBufferCount==0)...{
try ...{
System.err.println(name + "tries to read");
displayState("Buffer empty." + name + "waits");
wait();
} catch (InterruptedException e) ...{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
--occupiedBufferCount;
displayState(name + "reads" + buffer);
notify();
return buffer;
}
public void displayState(String operation) ...{
StringBuffer outputLine = new StringBuffer(operation);
outputLine.setLength(40);
outputLine.append(buffer + " " + occupiedBufferCount);
System.err.println(outputLine);
System.err.println();
}
}
//测试类
public class SharedBufferTest2 ...{
public static void main(String[] arg)...{
SynchronizedBuffer sharedLocation = new SynchronizedBuffer();
StringBuffer columnHeads = new StringBuffer("Operation");
columnHeads.setLength(40);
columnHeads.append("Buffer Occupied Count");
System.err.println(columnHeads);
System.err.println();
sharedLocation.displayState("Initial State");
Product product = new Product(sharedLocation);
Consumer consumer = new Consumer(sharedLocation);
product.start();
consumer.start();
}
}
public interface Buffer ...{
public void set(int value);
public int get();
}
//消费者
public class Consumer extends Thread...{
private Buffer sharedLocation;
public Consumer(Buffer shared)
...{
super("Consumer");
sharedLocation = shared;
}
public void run()
...{
int sum=0;
for(int i=1;i<=4;i++)
...{
try...{
Thread.sleep((int)(Math.random() * 3001));
sum = sum + sharedLocation.get();
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}
}
//生产者
public class Product extends Thread...{
private Buffer sharedLocation;
public Product(Buffer shared)
...{
super("Product");
sharedLocation = shared;
}
public void run()
...{
for(int i=1;i<=4;i++)
...{
try...{
Thread.sleep((int)(Math.random() * 3001));
sharedLocation.set(i);
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
System.err.println(getName() + "done producing." + " Termination" + getName() + ".");
}
}
//实现对共享数据的同步访问方法
public class SynchronizedBuffer implements Buffer...{
private int buffer = -1;
private int occupiedBufferCount = 0;
public synchronized void set(int value)
...{
String name = Thread.currentThread().getName();
while(occupiedBufferCount == 1)...{
try...{
System.err.println(name + " tries to write.");
displayState( "Buffer full. " + name + "waits.");
wait();
}catch(InterruptedException e)...{
e.printStackTrace();
}
}
buffer = value;
++occupiedBufferCount;
displayState(name + "writes" + buffer);
notify();
}
public synchronized int get() ...{
String name = Thread.currentThread().getName();
while(occupiedBufferCount==0)...{
try ...{
System.err.println(name + "tries to read");
displayState("Buffer empty." + name + "waits");
wait();
} catch (InterruptedException e) ...{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
--occupiedBufferCount;
displayState(name + "reads" + buffer);
notify();
return buffer;
}
public void displayState(String operation) ...{
StringBuffer outputLine = new StringBuffer(operation);
outputLine.setLength(40);
outputLine.append(buffer + " " + occupiedBufferCount);
System.err.println(outputLine);
System.err.println();
}
}
//测试类
public class SharedBufferTest2 ...{
public static void main(String[] arg)...{
SynchronizedBuffer sharedLocation = new SynchronizedBuffer();
StringBuffer columnHeads = new StringBuffer("Operation");
columnHeads.setLength(40);
columnHeads.append("Buffer Occupied Count");
System.err.println(columnHeads);
System.err.println();
sharedLocation.displayState("Initial State");
Product product = new Product(sharedLocation);
Consumer consumer = new Consumer(sharedLocation);
product.start();
consumer.start();
}
}
- 线程经典代码二,(同步情况下的生产者/消费者关系)
- 线程经典代码一,(未同步情况下的生产者/消费者关系)
- 线程经典代码三,(循环缓冲区,生产者/消费者关系)
- 经典线程同步问题(生产者&消费者)
- 线程同步之经典生产者-消费者模型
- 多线程间的同步-经典的生产者与消费者代码
- 经典的生产者消费者模型(二)
- 经典生产者与消费者问题(线程的同步与互斥)
- Java线程同步:生产者-消费者 模型(代码示例)
- 从生产者消费者窥探线程同步(下)
- 生产者、消费者 线程同步
- 线程同步--生产者消费者
- 生产者消费者模式的线程同步问题
- 线程同步:生产者和消费者的问题
- 3.4生产者/消费者的线程同步模型
- 生产者消费者问题(线程同步)
- 线程同步(消费者与生产者)
- 线程同步学习笔记(生产者消费者)
- 初学者必读 ASP运行环境的搭建
- Windows.NET Server: XML Web 服务
- string分隔tag的方法
- 接到工作前的准备工作 20070811
- 2007-8-11
- 线程经典代码二,(同步情况下的生产者/消费者关系)
- 360度看呼叫中心
- 思科统一通信应用问题解答
- 明天你来自己做外挂
- tomcat中的路径实践
- 用VB写下载者最短代码
- JavaPhone API和开发要点
- 关于单元测试自动打桩问题
- 在XP里提升自己的程序以获得特定的权限