Java中线程通信的机制

标签: java 线程 通信 | 发表时间:2012-01-22 19:06 | 作者:sdtarena
出处:http://blog.csdn.net



  package org.jaychang.corejava.review;

  import java.util.LinkedList;

  import java.util.List;

  /**

  *

  * @author Jay Chang

  *

  */

  class Stack {

  private List<Object> list = new LinkedList<Object>();

  /**

  * 出栈

  *

  * @return

  */

  public Object pop() {

  return list.remove(list.size() - 1);

  }

  /**

  * 将元素压入栈

  *

  * @param obj

  */

  public void push(Object obj) {

  list.add(list.size(), obj);

  }

  public int size() {

  return list.size();

  }

  }

  /**

  *

  * @author Jay Chang

  *

  */

  class Producer extends Thread {

  private Stack stack;

  public Stack getStack() {

  return stack;

  }

  /**

  *

  * @param stack

  */

  public void setStack(Stack stack) {

  this.stack = stack;

  }

  /**

  * 生产者生产商品,当商品栈满时,通知消费者消费商品

  */

  public void produce() {

  for (int i = 0; i < 100; i++) {

  // 同步stack

  synchronized (stack) {

  System.out.println("producer get the lock");

  //这里指定存放商品的商品栈的最大容量为10

  while (stack.size() == 10) {

  try {

  //将生产者线程持有stack对象的锁释放,并将生产者线程放到stack对象的等待池中

  stack.wait();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }
  // 模拟生产者生产商品过程所需的时间

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  String goods = "goods" + stack.size();

  //将生产的商品放到存放商品的商品栈中

  stack.push(goods);

  System.out.println("producer product " + goods);

  //唤醒在stack对象等待池中的等待的所有线程

  stack.notifyAll();

  }

  }

  }

  public void run() {

  produce();

  }

  }

  class Consumer extends Thread {

  private Stack stack;

  public Stack getStack() {

  return stack;

  }

  public void setStack(Stack stack) {

  this.stack = stack;

  }

  /**

  *

  * 消费者消费商品,当商品栈中为空时通知生产者生产商品

  */

  public void consume() {

  for (int i = 0; i < 100; i++) {

  synchronized (stack) {

  System.out.println("consumer get the lock");

  while (stack.size() == 0) {

  try {

  stack.wait();

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  // 模拟消费者消费商品,所需的时间

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  Object obj = stack.pop();

  System.out.println("cosumer consume " + obj);

  }

  }

  }

  public void run() {

  consume();

  }

  }

  public class Test{

  public static void main(String[] args) {

  Stack stack = new Stack();

  Consumer consumer = new Consumer();

  consumer.setStack(stack);

  Producer producer1 = new Producer();

  producer1.setStack(stack);

  Producer producer2 = new Producer();

  producer2.setStack(stack);

  consumer.start();producer1.start();producer2.start();

  }

  }

作者:sdtarena 发表于2012-1-22 19:06:32 原文链接
阅读:37 评论:0 查看评论

相关 [java 线程 通信] 推荐:

java中的线程通信

- - Java - 编程语言 - ITeye博客
原文链接 作者:Jakob Jenkov. 译者:杜建雄  校对:方腾飞. java中线程通信的目标是使线程间能够互相发送信号. 另一方面,线程通信使线程能够等待其他线程的信号. 例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了. java学习中线程间发送信号的一个简单方式是在共享对象的变量里设置信号值.

Java中线程通信的机制

- - CSDN博客推荐文章
  * 生产者生产商品,当商品栈满时,通知消费者消费商品.   // 同步stack.   //这里指定存放商品的商品栈的最大容量为10.   //将生产者线程持有stack对象的锁释放,并将生产者线程放到stack对象的等待池中.   // 模拟生产者生产商品过程所需的时间.   //将生产的商品放到存放商品的商品栈中.

Java线程池

- - 企业架构 - ITeye博客
线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的. 在jdk1.5之后这一情况有了很大的改观. Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用. 为我们在开发中处理线程的问题提供了非常大的帮助.

Java 线程池

- - 编程语言 - ITeye博客
在项目中,系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互. 在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存周期很短的线程时,更应该考虑使用线程池. 使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数参数可以控制系统中并发线程数不超过此数.

Java Thread多线程

- - CSDN博客推荐文章
Java Thread多线程. Java 多线程例子1 小例子. super("zhuyong");//设置线程的名字,默认为“TestThread”. Java 多线程例子2 前台线程(用户线程) 后台线程(守护线程 ). 1,setDaemon(true)后就是后台线程(守护线程 ),反之就是前台线程(用户线程).

Java线程之FutureTask

- - zzm
FutureTask是Future和Callable的结合体. 然后通过Future来取得计算结果. 但是,若开启了多个任务,我们无从知晓哪个任务最先结束,因此,若要实现“当某任务结束时,立刻做一些事情,例如记录日志”这一功能,就需要写一些额外的代码. FutureTask正是为此而存在,他有一个回调函数protected void done(),当任务结束时,该回调函数会被触发.

[Java] Java 多线程案例分析

- - V2EX
现要从 hbase中导出 2016 年整年的,大约 10w只股票行情数据,数据总量约 100t. 汇总到 hdfs中供需求方使用. 已知数据量规模大概是 100t,那么单台机器处理肯定不是不行的,先不说大多数磁盘都没这么大,即便磁盘有这么大,单台机器处理对于内存和 cpu 要求也很高,所以我们将问题一般化,使用数量有限的低配机器.

Java多线程之synchronized

- - CSDN博客推荐文章
这里通过三个测试类阐述了synchronized应用的不同场景. 首先是最基本的synchronized Method的使用.  * @see 概述:Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor) .  * @see 说明:当synchronized关键字修饰一个方法时,则该方法为同步方法 .

java线程池分析

- - BlogJava-首页技术区
    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成. 5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务.

java线程取消方式

- - 编程语言 - ITeye博客
JAVA任务取消方式一般有2种. 第一种设置某个取消标志,任务定期查看该标志,这种方式存在任务取消并不能保证任务立即取消,更糟糕的是有可能任务永远不会结束. 第二种是利用的中断机制,JVM并不能保证阻塞方法检测到中断的速度,但是实际中还是非常快的. 实例一(使用取消标志,会发现取消的任务还执行中,只有执行完再次检测标志任务才取消).