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线程池技术的 ...
随机推荐
- iOS多语言
https://blog.csdn.net/huangmindong/article/details/53464334 App多语言,字符串统一放在 Localizable.strings 文件里. ...
- 打开Delphi 10.2提示脚本错误的解决方法
HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\Known IDE Packages $(BDS)\Bin\CommunityToolbar240.bp ...
- 利用目录函数(opendir,readdir,closedir)查找文件个数
如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数.Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配 ...
- PHP 操作Mongodb 实例
缩略版本<?php //1.连接MongoDB $mongo = new Mongo(); $mongo = new Mongo("mongodb://username:passwor ...
- 利用官方的vue-cli脚手架来搭建Vue集成开发环境
在利用vue-cli脚手架搭建vue集成环境之前,我们需要先安装nodejs的环境.如果在cmd中输入node --version和npm --version出现如下的版本信息,就说明安装已经成功了. ...
- JDBC使用步骤分哪几步?
(1) 加载JDBC驱动程序: Cllass.forName(" 驱动程序" ); //你要连接的数据库对象 (2) 建立连接 Connection conn=DriverMa ...
- SQL Server 中BIT类型字段增删查改那点事
话说BIT类型字段之前,先看“诡异”的一幕,执行Update成功,但是查询出来的结果依然是1,而不是Update的2 当别人问起我来的时候,本人当时也是处于懵逼状态的,后面联想具体的业务突然想起来这个 ...
- java 导包
在maven 中搜索相关模块依赖 http://mvnrepository.com/artifact/org.apache.spark/spark-mllib_2.10/1.0.0 dependenc ...
- whatweb工具
WhatWeb WhatWeb可以用来确定服务器使用的CMS.博客平台.统计分析软件包.JavaScript库等.这个工具有超过900个插件用来扫描目标. 使用方法: root@root:/pente ...
- Eclipse 合并GIT分支
合并GIT分支: 1. 切换到主分支: 2. 右击项目——Team——Merge…: 3. 在弹出的Merge框中选择要合并的分支——Merge: 4. 合并后如果出现冲突,右击项目——Tea ...