java 线程Thread 技术--方法演示生产与消费模式
利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费:
在effective Java 中有说过:
1. 在Java 中 ,使用wait() 方法,你99% 情况都是要和while 连用
2. 永远都要使用notifyAll() 而不是notify();
package com.java.baseknowledge.concurrent.thread; /**
* Thread class and Object method recommend:
* provider and customer use wait() and notify() method
* @author iscys
*
*/
public class ThreadMethod { public static void main(String[] args) {
Sample sample =new Sample();
Increase in =new Increase(sample);
Decrease de =new Decrease(sample);
Thread th1 =new Thread(in);
Thread th2 =new Thread(de); Increase in1 =new Increase(sample);
Decrease de1 =new Decrease(sample);
Thread th11 =new Thread(in1);
Thread th21 =new Thread(de1);
th1.start();
th2.start();
th11.start();
th21.start();
} }
/**
* increase thread
* @author cys
*
*/
class Increase implements Runnable{ private Sample sample;
public Increase(Sample sample) {
this.sample=sample;
}
@Override
public void run() {
for(int i=0;i<20;i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sample.increase();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} class Decrease implements Runnable{ private Sample sample;
public Decrease(Sample sample) {
this.sample=sample;
}
@Override
public void run() {
for(int i=0;i<20;i++)
{
try {
Thread.sleep(500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} try {
sample.decrease();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Sample{ private int i; public synchronized void increase() throws Exception {
/**使用while 可以每次检查,不能使用if ,会造成问题,什么样的问题,把while 改成if 试试看**/
while(0!=i) {
this.wait();
}
i++;
System.out.println(i);
this.notifyAll();
} public synchronized void decrease() throws Exception {
/**使用while 可以每次检查,不能使用if ,会造成问题,什么样的问题,把while 改成if 试试看**/
while(0==i) {
this.wait();
}
i--;
System.err.println(i);
this.notifyAll();
}
}
java 线程Thread 技术--方法演示生产与消费模式的更多相关文章
- java 线程Thread 技术--线程状态与同步问题
线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...
- java 线程Thread 技术--创建线程的方式
在第一节中,对线程的创建我们通过看文档,得知线程的创建有两种方式进行实现,我们进行第一种方式的创建,通过继承Thread 类 ,并且重写它的run 方法,就可以进行线程的创建,所有的程序执行都放在了r ...
- java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式
在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synch ...
- java 线程Thread 技术--线程方法详解
Thread 类常用的方法与Object类提供的线程操作方法:(一个对象只有一把锁
- java 线程Thread 技术--1.5 Future与Callable
Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...
- java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue
Executors : Executors ,就是一个线程工具类:大部分操作线程的方法,都可以在这个工具类中就行创建,执行,调用一些线程的方法: Executor : 用于执行和提交一个runnabl ...
- java 线程Thread 技术--线程创建源码解释
永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...
- java 线程Thread 技术--volatile关键字
java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...
- java线程池技术(二): 核心ThreadPoolExecutor介绍
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...
随机推荐
- DOM节点的增删改查以及class属性的操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c#与wpf的一些基础语法问题(摘用)
1 .在vs里不同cs文件,位于同一个namespace,是什么情况. 答:http://msdn.microsoft.com/zh-cn/library/0d941h9d(v=vs.80).aspx ...
- Delphi FrieDAC 大数据处理
Delphi FrieDAC 大数据处理 大数据处理, 要用到Array DML 插入数据 先要设置插入的数据量 FQuery1.Params.ArraySize := 1000; for index ...
- C++复习:类和对象
类和对象 基本概念 1)类.对象.成员变量.成员函数 2)面向对象三大概念 封装.继承.多态 3)编程实践 类的定义和对象的定义,对象的使用 求圆形的面积 定义Teacher类 ...
- IE (第一部分) 浏览器 中 关于浏览器模式和文本模式的困惑
什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和文本模式,对于这两个名词,综合相关文档解释如下: 浏览器模式(Browser Mode),用于切换IE针对该网页的默认文 ...
- 解决ngui挡住粒子的问题
using UnityEngine; using System.Collections; [ExecuteInEditMode] public class ControlParticle : Mono ...
- Windows组件下载地址
Windows下载中心 http://www.microsoft.com/zh-cn/download/default.aspx IE10下载地址 http://www.microsoft.com/z ...
- LinQ to sql 各种数据库查询方法
1.多条件查询: 并且 && 或者 || var list = con.car.Where(r => r.code == "c014" || r.oil == ...
- devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior
问题: 制作镜像的时候报错 devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 1 ...
- 面向对象程序设计(Java)本学期课程改革说明
1.教学方式采用反转课堂教学法,学生课前完成知识的学习,课堂是师生之间.学生之间互动的场所,包括答疑解惑.知识的运用技巧探讨等,教师的课堂责任是理解学生的问题和引导学生去运用知识. 2.为更好地执行反 ...