知识大全 Java多线程例子

Posted

篇首语:追风赶月莫停留,平芜尽处是春山。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java多线程例子相关的知识,希望对你有一定的参考价值。

Java多线程例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  写出一组模拟生产者/消费者的协作程序

  其中包括一个WoTou java 代表消息

  一个MsgQueue java 为一个队列 提供put(Message msg)方法和get()方法

  一个Produer java 为生产者线程 在其run方法中每隔 秒产生一个Message对像并放入MsgQueue队列

  一个Consumer java为消费者线程 在其run方法中不断从MsgQueue队列中获取Message对像 并显示在屏幕上

  一个TestMain java 在其main方法中 启动 个Produer线程和 个消费者线程

  要求

  对于MsgQueue java 队列的长度为 当消息超过 个时 put()方法需要阻塞 当消息队列为空时

  get()方法需要阻塞

  public class ProducerConsumer

  public static void main(String[] args)

  SyncStack ss = new SyncStack();

  Producer p = new Producer(ss p );

  Consumer c = new Consumer(ss c );

  Producer p = new Producer(ss p );

  Consumer c = new Consumer(ss c );

  

  

  class WoTou<T>

  int id;

  WoTou(int id)

  this id = id;

  

  public String toString()

  return WoTou : + id;

  

  

  class SyncStack

  int index = ;

  WoTou[] arrWT = new WoTou[ ];

  public void push(WoTou wt)

  while(index == arrWT length)

  try

  this wait();

   catch (InterruptedException e)

  e printStackTrace();

  

  

  this notifyAll();

  arrWT[index] = wt;

  index ++;

  

  public WoTou pop()

  while(index == )

  try

  this wait();

   catch (InterruptedException e)

  e printStackTrace();

  

  

  this notifyAll();

  index ;

  return arrWT[index];

  

  

  class Producer implements Runnable

  SyncStack ss = null;

  String a;

  Producer(SyncStack ss String a)

  this ss = ss;

  this a= a;

  Thread t=new Thread(this a);

  t start();

  

  public void run()

  for(int i= ; i< ; i++)

  synchronized(ss)

  WoTou wt = new WoTou(i);

  ss push(wt);

  System out println(a+ 生产了 + wt);

  try

  Thread sleep((int)(Math random() * ));

   catch (InterruptedException e)

  e printStackTrace();

  

  

  

  

  class Consumer implements Runnable

  SyncStack ss = null;

  String a;

  Thread t;

  Consumer(SyncStack ss String a)

  this ss = ss;

  this a= a;

  t=new Thread(this a);

  t start();

  

  public void run()

  for(int i= ; i< ; i++)

  synchronized(ss)

  WoTou wt = ss pop();

  System out println(a+ 消费了: + wt);

  try

  Thread sleep((int)(Math random() * ));

   catch (InterruptedException e)

  e printStackTrace();

  

  

  

  

  p 生产了 WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  c 消费了: WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  p 生产了 WoTou :

  栈里有 个

  作为多线程交互一的一个重要应用 定义用户输入和输出的列队类或者堆栈类一定要看成一个整体放进同步语句块里面 不能简单的分别调用输入同步方法或者输出同步方法 下面的程序就有问题 下面这个是一个教程例子 但是结果不对 究其原因实际上是因为列队类或者堆栈类是一个可变类 这种可变类要是有参数传递给某些不可变类时 可变类的构造方法必须也设置成为同步方法 不然就会出错

  public class ProducerConsumer

  public static void main(String[] args)

  SyncStack ss = new SyncStack();

  Producer p = new Producer(ss);

  Consumer c = new Consumer(ss);

  new Thread(p) start();

  new Thread(p) start();

  new Thread(p) start();

  new Thread(c) start();

  

  

  class WoTou

  int id;

  WoTou(int id)

  this id = id;

  

  public String toString()

  return WoTou : + id;

  

  

  class SyncStack

  int index = ;

  WoTou[] arrWT = new WoTou[ ];

  public synchronized void push(WoTou wt)

  while(index == arrWT length)

  try

  this wait();

   catch (InterruptedException e)

  e printStackTrace();

  

  

  this notifyAll();

  arrWT[index] = wt;

  index ++;

  

  public synchronized WoTou pop()

  while(index == )

  try

  this wait();

   catch (InterruptedException e)

  e printStackTrace();

  

  

  this notifyAll();

  index ;

  return arrWT[index];

  

  

  class Producer implements Runnable

  SyncStack ss = null;

  Producer(SyncStack ss)

  this ss = ss;

  

  public void run()

  for(int i= ; i< ; i++)

  WoTou wt = new WoTou(i);

  ss push(wt);

  System out println( 生产了 + wt);

  try

  Thread sleep((int)(Math random() * ));

   catch (InterruptedException e)

  e printStackTrace();

  

  

  

  

  class Consumer implements Runnable

  SyncStack ss = null;

  Consumer(SyncStack ss)

  this ss = ss;

  

  public void run()

  for(int i= ; i< ; i++)

  WoTou wt = ss pop();

  System out println( 消费了: + wt);

  try

  Thread sleep((int)(Math random() * ));

   catch (InterruptedException e)

  e printStackTrace();

  

  

  

  

cha138/Article/program/Java/gj/201311/27299

相关参考

知识大全 Java线程;生产消费者例子

Java线程;生产消费者例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  小小回顾写了个简单的

知识大全 socket 线程 思路 java

  网上参考别人的例子改自己的程序终于搞明白了原来在socket的服务器端设置线程并不是像之前想的那样建立一个连接后就重新开一个端口去监听这样的想法遇到了很多问题首先当我把客户端弄成for循环递增的链

知识大全 Java的多线程-实现多线程及线程的同步

Java的多线程-实现多线程及线程的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.实现

知识大全 Java多线程编程基础之线程和多线程

Java多线程编程基础之线程和多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着计算机技

知识大全 Java多线程如何创建多个线程

Java多线程如何创建多个线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java多线程的同

知识大全 超线程多核心下Java多线程编程分析

超线程多核心下Java多线程编程分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Java环

知识大全 超线程多核心下Java多线程编程技术分析[4]

超线程多核心下Java多线程编程技术分析[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 超线程多核心下Java多线程编程技术分析[3]

超线程多核心下Java多线程编程技术分析[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 超线程多核心下Java多线程编程技术分析[1]

超线程多核心下Java多线程编程技术分析[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 超线程多核心下Java多线程编程技术分析[2]

超线程多核心下Java多线程编程技术分析[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb