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线程池技术的 ...
随机推荐
- Servlet基本_画面遷移
画面遷移方法は.下記ようがある.・リクエストのディスパッチ・リダイレクト(画面から) 1.ディスパッチ1)概念サーブレットから他のリソース(サーブレット.JSP.Htmlなど)にリクエストを転送するこ ...
- CC攻击与DDOS攻击区别
二者的攻击方式主要分为三种:直接攻击.代理攻击.僵尸网络攻击 CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些.这种攻击你见不到虚假IP,见不到特别大的异常流 ...
- vim主题设定
Vim的颜色主题在/usr/share/vim/vim74/colors文件夹里. 打开vim后在normal模式下输入“:colorscheme”查看当前的主题,修改主题使用命令“:colorsch ...
- [PHP]PHP定时任务的实现
---------------------------------------------------------------------------------------------------- ...
- http post 接口
集团需求管理系统通过网状网与给各省公司需求管理系统进行交互.落地方为发起方提供访问的URL,发起方使用HTTP POST方法发送请求报文并得到应答报文,发起方作为落地方的HTTP客户端,落地方作为发起 ...
- python java scala 单例模式
Python class Single2(object): """ 同一个对象 """ __instance = None def __ne ...
- JAVAWEB 一一 框架整合(SSH,Spring+Struts2+Hibernate IOC/DI AOP声明式事务处理 定时任务)
package org.springframework.orm.hibernate3; import java.io.Serializable; import java.util.List; impo ...
- python 装饰器、递归原理、模块导入方式
1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...
- centos6.5下oracle自动备份删除指定天数的文件
第一步先做一个备份 #!/bin/sh export ORACLE_BASE=/home/oracle/app export ORACLE_HOME=/dbhome_1 export ORACLE_S ...
- 360sdk网游支付服务
网游支付服务 目录 1.流程介绍2.接口介绍2.1支付接口[客户端调用](必接)2.2支付结果通知接口–应用服务器提供接口, 由360服务器回调(必接)2.3订单核实接口– 服务器端接口, 应用服 ...