也是一个笔试题,诸多借口没做好。还是自己没理解透多线程。吾日三省吾身。
代码很多copy JDK6.0的API,也有改写一点点。
class Product {}
/**
*该类是JDK6.0API中的Condition中的示例。
*此外现成的BlockingQueue的实现:用于生产者-使用者队列,而且是线程安全的。
*BlockingQueue的实现的所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。
*/
class Storage<T>
{
private int capacity;
private int count;
private T[] items;
int putptr, takeptr;
private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();
public Storage(int capacity,Class<?> type)
{
this.capacity=capacity;
items=(T[])Array.newInstance(type, capacity);
}
public void put(T x) throws InterruptedException
{
lock.lock();
try
{
while (count == capacity)
notFull.await();
items[putptr] = x;
if (++putptr == capacity)
putptr = 0;
++count;
notEmpty.signal();
}
finally
{
lock.unlock();
}
}
public T take() throws InterruptedException
{
lock.lock();
try
{
while (count == 0)
notEmpty.await();
T x = items[takeptr];
if (++takeptr == capacity)
takeptr = 0;
--count;
notFull.signal();
return x;
}
finally
{
lock.unlock();
}
}
}
/**
* 生产者、消费者来自JDK6.0 API BlockingQueue里的示例
*/
class Producer implements Runnable
{
public void run()
{
while(!Thread.currentThread().isInterrupted())
{
try{
cLock.lockInterruptibly();
try{
if(count>32)
{
Thread.currentThread().interrupt();
System.out.println(name+":退出");
}
storage.put(produce());
}finally{cLock.unlock();}
}catch (InterruptedException ex){Thread.currentThread().interrupt(); }
}
}
private final Storage<Product> storage;
private String name;
private static int count;
private static Lock cLock=new ReentrantLock() ;
public Producer(Storage<Product> storage,String name)
{
this.storage=storage;
this.name=name;
}
private Product produce() throws InterruptedException
{
Thread.sleep(600);
cLock.lockInterruptibly();
try{
count++;
System.out.println(name+"生产第"+count+"个");
return new Product();
}finally{cLock.unlock();}
}
}
class Consumer implements Runnable
{
public void run()
{
while(!Thread.currentThread().isInterrupted())
{
try{
cLock.lockInterruptibly();
try{
if(count>32)
{
Thread.currentThread().interrupt();
System.out.println(name+":退出");
}
consume(storage.take());
}finally{cLock.unlock();}
} catch (InterruptedException ex){Thread.currentThread().interrupt(); }
}
}
private final Storage<Product> storage;
private String name;
private static int count;
private static Lock cLock=new ReentrantLock() ;
public Consumer(Storage<Product> storage,String name)
{
this.storage=storage;
this.name=name;
}
void consume(Product product) throws InterruptedException
{
Thread.sleep(800);
cLock.lockInterruptibly();
try{
count++;
System.out.println(name+"消费第"+count+"个");
}finally{cLock.unlock();}
}
}
public class Cs
{
public static void main(String[] args)
{
Storage<Product> q = new Storage<Product>(20,Product.class);
Producer p = new Producer(q,"p");
Consumer c1 = new Consumer(q,"c1");
Consumer c2 = new Consumer(q,"c2");
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
分享到:
相关推荐
c#多线程之生产者消费者
java多线程实现生产者和消费者
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
所谓的生产者消费者模型,是通过一个容器来解决生产者和消费者的强耦合问题。通俗的讲,就是生产者在不断的生产,消费者也在不断的消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器,我们可以把...
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
Linux 多线程实现生产者消费者模式.pdf
使用多线程实现了生产者和消费者模式
java多线程实现生产者消费者关系,完成线程之间的同步。
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
基本满足操作系统课上要求,java实现的生产者消费者模型。
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
本文通过多线程方法解决了生产者与消费者之间同步的问题
多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...
生产者消费者流程图; 生产者消费者流程图。
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
涉及 线程创建与退出、线程暂停、父子线程之前以及兄弟线程之间的参数和信号传递、多线程的以及多线程的管理。要求是练习的demo对于以上的点只要涉及基础即可。 主线程、生产者线程(一)、消费者管理线程(一)、...
delphi多线程生产者消费者模式源程序