wait和sleep区别:
1.wait可以指定时间可以不指定。
    sleep必须指定时间。
2.在同步时,对cpu的执行权和锁的处理不同。
    wait:释放执行权,释放锁。
    sleep:释放执行权,不释放锁。

/*

* 等待/唤醒机制

* 设计的方法:

* 1.wait():让线程处于等待状态,被wait的线程会被存储到线程池中。

* 2.notify():唤醒线程池中的一个线程(任意)

* 3.notifyAll():唤醒线程池中的所有线程。

* 这些方法都必须定义在同步中。

* 因为这些方法是用于操作线程状态的方法。必须要明确到底操作的是哪个锁上的线程。********

*

* 为什么操作线程的方法定义在Object中:   因为这些方法都是监视器的方法,监视器其实就是锁。

* 锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。

*

*

* 生产者和消费者:

*/

class Resrouce

{

private String name;

private int count = 1;

private boolean flag = false;

public synchronized void set(String name)

{

while(flag)

{

try

{

this.wait();//让该线程睡着(等待)

}

catch (InterruptedException e)

{

// TODO: handle exception

}

}

this.name = name + count;

count++;

System.out.println(Thread.currentThread().getName()+"....生产者。。。。"+this.name);

flag = true;

/*

* notify唤醒任意一个会出现死锁问题

*/

//notify();//去唤醒一个(睡着的的线程)

//所以唤醒全部

notifyAll();

}

public synchronized void out()

{

while(!flag)

{

try

{

this.wait();//让该线程睡着

}

catch (InterruptedException e)

{

// TODO: handle exception

}

}

System.out.println(Thread.currentThread().getName()+"-----------------消费者-"+ this.name);

flag = false;

/*

* notify唤醒任意一个会出现死锁问题

*/

//notify();//去唤醒一个(睡着的的线程)

//所以唤醒全部

notifyAll();

}

}

//生产者

class Producer implements Runnable

{

private Resrouce r;

Producer(Resrouce r)

{

this.r = r;

}

@Override

public void run()

{

// TODO Auto-generated method stub

while(true)

r.set("馒头");

}

}

//消费者

class Consumer implements Runnable

{

private Resrouce r;

Consumer(Resrouce r)

{

this.r = r;

}

@Override

public void run()

{

// TODO Auto-generated method stub

while(true)

r.out();

}

}

public class ResourceTest

{

/**

* @param args

*/

public static void main(String[] args)

{

// TODO Auto-generated method stub

Resrouce r = new Resrouce();

Consumer c1 = new Consumer(r);

Consumer c2 = new Consumer(r);

Producer p1 = new Producer(r);

Producer p2 = new Producer(r);

Thread t1 = new Thread(p1);

t1.start();

Thread t2 = new Thread(p2);

t2.start();

Thread t3 = new Thread(c1);

t3.start();

Thread t4 = new Thread(c2);

t4.start();

}

}

l

======================================================================

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/*

* 生产者和消费者:

*

* jdk1.5以后将同步和锁封装成了对象。并将操作锁的隐式方式定义到了该对象中。将隐式动作变成了显示动作。*******************

Lock接口:出现替代了同步代码块或者同步函数,将同步的隐式锁操作变成现实锁操作

lock():获取锁。  通常需要定义在finally代码中。

Condition接口: 出现替代了Object中的wait   notify   notifyAll方法。

将这些监视器方法单独进行封装,变成Condition监视器对象   可以任意进行组合。

await();

signal();

signalAll();

*/

class Resrouce

{

private String name;

private int count = 1;

private boolean flag = false;

Lock lock = new ReentrantLock();//定义一把锁

//通过已有的锁  获取该锁上的监视器对象。

Condition con = lock.newCondition();

Condition Producer_con = lock.newCondition();//生产者的监视器

Condition Consumer_con = lock.newCondition();//消费者的监视器

public void set(String name)

{

lock.lock();//获取一把锁

try

{

while(flag)

{

try

{

//con.await();

Producer_con.await();//生产者等待   去唤醒一个消费者

}

catch (InterruptedException e)

{

// TODO: handle exception

}

}

this.name = name + count;

count++;

System.out.println(Thread.currentThread().getName()+"....生产者。。。。"+this.name);

flag = true;

//con.signalAll();

Consumer_con.signal();//唤醒消费者

}

catch (Exception e)

{

// TODO: handle exception

}

finally

{

lock.unlock();

}

}

public  void out()

{

lock.lock();//获取锁

try

{

while(!flag)

{

try

{

//con.await();

Consumer_con.await();//让消费者等待    然后去唤醒一个生产者。。

}

catch (InterruptedException e)

{

// TODO: handle exception

}

}

System.out.println(Thread.currentThread().getName()+"-----------------消费者-"+ this.name);

flag = false;

//con.signalAll();

Producer_con.signal();//唤醒生产者

}

catch (Exception e)

{

// TODO: handle exception

}

finally

{

lock.unlock();

}

}

}

//生产者

class Producer implements Runnable

{

private Resrouce r;

Producer(Resrouce r)

{

this.r = r;

}

@Override

public void run()

{

// TODO Auto-generated method stub

while(true)

r.set("馒头");

}

}

//消费者

class Consumer implements Runnable

{

private Resrouce r;

Consumer(Resrouce r)

{

this.r = r;

}

@Override

public void run()

{

// TODO Auto-generated method stub

while(true)

r.out();

}

}

public class ResourceTest

{

/**

* @param args

*/

public static void main(String[] args)

{

// TODO Auto-generated method stub

Resrouce r = new Resrouce();

Consumer c1 = new Consumer(r);

Consumer c2 = new Consumer(r);

Producer p1 = new Producer(r);

Producer p2 = new Producer(r);

Thread t1 = new Thread(p1);

t1.start();

Thread t2 = new Thread(p2);

t2.start();

Thread t3 = new Thread(c1);

t3.start();

Thread t4 = new Thread(c2);

t4.start();

}

}

停止线程的方法:




版权声明:本文为博主原创文章,未经博主允许不得转载。

Java——线程间通信问题的更多相关文章

  1. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  2. Java线程间通信之wait/notify

    Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.我们来看下相关定义: w ...

  3. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  4. Java——线程间通信

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. 说说Java线程间通信

    序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...

  6. 说说 Java 线程间通信

    序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...

  7. java线程间通信1--简单实例

    线程通信 一.线程间通信的条件 1.两个以上的线程访问同一块内存 2.线程同步,关键字 synchronized 二.线程间通信主要涉及的方法 wait(); ----> 用于阻塞进程 noti ...

  8. java线程间通信之通过管道进行通信

    管道流PipeStream是一种特殊的流,用于在不同线程间直接传送数据,而不需要借助临时文件之类的东西. jdk中提供了四个类来使线程间可以通信: 1)PipedInputStream和PipedOu ...

  9. Java线程间通信

    1.由来 当需要实现有顺序的执行多个线程的时候,就需要进行线程通信来保证 2.实现线程通信的方法 wait()方法: wait()方法:挂起当前线程,并释放共享资源的锁 notify()方法: not ...

随机推荐

  1. shell变量的使用

    转载请标明http://www.cnblogs.com/winifred-tang94/ shell环境中变量有三种类型: a.  环境变量:可以在shell脚本中直接利用“$环境变量名称”的形式引用 ...

  2. namenode 无法启动之每次开机需要重新格式化-tmp

    最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动        每次开机都得重新格式化一下namenode才可以        其实问题就出在tmp文件,默 ...

  3. iOS中类方法的作用

    类方法,这意味着你将它发送给类,而不是对象实例. 因为不是发送给一个实例,所以你不能使用任何实例变量,你只能做一些通用性的事情. 实际上类方法只用于两种情况: 1.创建事物,比如创建一个特殊格式的字符 ...

  4. iOS开发经验总结(转)

    在iOS开发中经常需要使用的或不常用的知识点的总结,几年的收藏和积累(踩过的坑). 一. iPhone Size 手机型号 屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s ...

  5. 数组prototype添加函数呢,采用回调判定函数内容

    1.解决方案 Array.prototype.all = function (p) { return this.filter(p).length == this.length; }; Array.pr ...

  6. 计算几何----判断空间点是否在一个四面体(tetrahedron)内部

    DESCRIPTION: 判断空间点 P(x, y, z)是否在一个四面体的内部? Let the tetrahedron have vertices V1 = (x1, y1, z1) V2 = ( ...

  7. sublime3笔记

    选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数名 ...

  8. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  9. Java_oop_继承

    不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰.想想还有点小激动呢, OK,睡醒了,我们说到继承就先来学习一下Java中继承的语法. public SubClass exte ...

  10. 传智播客JavaWeb day01 快捷键、XML

    2015-01-14 一直计划着学习java,今天晚上终于下定决心看了下传智播客朴乾老师的javaweb开发视频day01之第一讲,主要内容是开发工具简单介绍.怎么创建工程.Junit的介绍,我是C# ...