Java Day 14
多线程--线程间通信
对同一个资源进行处理,但是任务却不同
线程间通信--等待唤醒机制
1、wait(); 线程处于冻结状态,被wait线程存储在线程池中
2、notify(); 从线程池唤醒一个线程
3、notifyAll(); 唤醒所有线程
方法必须定义在同步中
为什么操作线程的方法wait notify notifyAll定义在Object类中
因为这些方法是监视器的方法,监视器其实就是锁
锁可以是任意的对象,任意的对象调用的方式一定是定义在Object类中
唤醒--代码优化
多生产者多消费者
多生产多消费者问题解决
notifyAll();
while判断标记,解决了线程获取执行权后是否重新运行
notifyAll()解决了本方线程一定唤醒对方线程
多生产多消费问题 JDK1.5新特性 -- Lock
同步代码块,对于锁的操作是隐式的。
import java.util.concurrent.locks.*;
//import java.util.condition;
class Resource{
private String name;
private int count = 1;
private boolean flag = false;
Lock lock = new ReentrantLock();
//Condition c1 = lock.newCondition();
Condition pro_con = lock.newCondition();
Condition cos_con = lock.newCondition(); Resource(){} public void set(String name){//synchronized
lock.lock();
try{
while(flag)//while(flag)--死锁
//try{wait();}catch(InterruptedException e){}
try{pro_con.await();}catch(InterruptedException e){}
this.name = name + count;
count++;
System.out.println(Thread.currentThread().getName()+": 生产..5.0. "+this.name);
flag = true;
//notifyAll();//notifyAll()
//c1.signalAll();//notifyAll()
cos_con.signal();//notifyAll()
}
finally{
lock.unlock();
} } public void out(){ //synchronized
lock.lock();
try{
while(!flag)//while(flag)--出现死锁--notifyAll()
try{cos_con.await();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+":...消费了......"+name);
flag = false;
//notifyAll();//notifyAll()}
//c1.signalAll();
pro_con.signal(); }
finally{
lock.unlock();//notifyAll()
}
}
} class Producer implements Runnable{
private Resource r;
Producer(Resource r){
this.r = r;
} public void run(){
while(true){
r.set("烤鸭");
} }
} class Consumer implements Runnable{
private Resource r;
Consumer(Resource r){
this.r = r;
}
public void run(){
while(true){
r.out();
}
}
} class ProduceConsumerDemo{
public static void main(String[] args){
Resource r = new Resource();
Producer pro = new Producer(r);
Consumer con = new Consumer(r); Thread t0 = new Thread(pro);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
Thread t3 = new Thread(con); t0.start();
t1.start();
t2.start();
t3.start(); }
}
将同步和锁封装成了对象
JDK1.5新特性--condition
wait notify notifyAll
JDK1.5解决方法
一个锁多个监视器
范例
Lock 接口:替代了同步代码块或同步函数,由隐式锁操作变成显示
lock() 获取锁
unlock() 释放锁 在finally代码块中
Condition 接口 替代了Object中的wait notify notifyAll方法,单独进行封装
await
signal
signalAll
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
wait sleep 区别
1、wait可以指定时间也可以不指定,sleep必须指定
2、在同步中,对cpu的执行权和锁的处理不同
wait 释放执行权和锁
sleep 释放执行权 不是释放锁
停止线程方式--定义标记
1、stop方法
2、run方法结束
怎么控制线程的任务结束呢?
控制循环就可以结束任务
停止线程方式--Interrupt
如果线程处于冻结状态,无法读取标记,如何结束?
interrupt 将线程从冻结强制恢复成运行状态,但会发生中断异常
守护进程--setDaemon
后台线程,先于线程启动前调用
join方法
setPriority(Thread.MAX_PRIORITY)
yield
Java Day 14的更多相关文章
- 【译】Java SE 14 Hotspot 虚拟机垃圾回收调优指南
原文链接:HotSpot Virtual Machine Garbage Collection Tuning Guide,基于Java SE 14. 本文主要包括以下内容: 优化目标与策略(Ergon ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java EE (14) -- SSH配置
整合Spring与Struts1的三种方法总结 无论用那种方法来整合,第一步都是要装载spring的应用环境,有三种方式: #1. struts-config.xml <?xml version ...
- JAVA进阶14
间歇性混吃等死,持续性踌躇满志系列-------------第14天 1.线程的加入 package code0328; import javax.swing.*; import java.awt.* ...
- Java虚拟机14:类加载器
类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...
- java基础14 多态(及关键字:instanceof)
面向对象的三大特征: 1.封装 (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承 ...
- Android开发基础(java)14
Java语言与其他编程语言的最大不同之处在于:java有专门的异常处理机制,实现对各类异常情况进行有效控制. 一.基本概念:异常和错误的区别与联系: (1).定义形式不同:异常为exception:错 ...
- linux(centos8):安装java jdk 14 (java 14.0.2)
一,下载jdk14 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...
- Thinking in Java——笔记(14)
Type Information The need for RTTI Because it is a dynamically bound method, the proper behavior wil ...
- Java 第14章 字符串
字符串 基本数据类型和引用数据类型作为方法参数 ,在传递时有什么不同之处. 答:基本数据类型按值传递,相当于复制了一份过去. 引用数据类型是指向引用 内存地址,两个地方 根据地址使用同一份数据,如被更 ...
随机推荐
- jquery 设置元素内容html(),text(),val()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【MongoBD】MongoBD持久化
参考:http://f.dataguru.cn/thread-139560-1-1.html 参考:http://blog.mongodb.org/post/33700094220/how-mongo ...
- python3的文件操作
open的原型定义在bultin.py中,是一种内建函数,用于处理文件 open(file, mode='r', buffering=None, encoding=None, errors=None, ...
- 如何判断raid1中哪块硬盘损坏?
服务器 2块硬盘做的raid1,如果其中有一块坏掉,如何能判断是哪块坏掉? 方法①.通过硬盘硬件指示灯进行观察,一般黄灯代表硬盘存在问题,显示红灯则代表硬盘损坏.方法②.通过开机进入阵列配置进行查看, ...
- .NET Web开发总结(五)
7 常用服务器控件 7.1 服务器控件概述 · 服务器控件是指在服务器上执行程序的代码的组件 通常这些服务器控件会提供 给用户一定的界面, 以便用户与服务器之间快速的交互 7.2 HTML 服 ...
- 使用CSS创建有图标的网站导航菜单
在我创建的每一个互联网应用中,我都试图避免创建完全由图片组成的菜单.在我看来,网页菜单系统中应该使用文字.这样做也会让菜单变得更干净利落.清晰和易读,不用考虑应用程序如何读取它,以及页面放大的时候也不 ...
- linu流量监控
iftophttp://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858923.html 默认是监控第一块网卡的流量iftop 监控eth1iftop ...
- javascript oo实现(转)
javascript oo实现 By purplebamboo 7月 13 2014 更新日期:8月 21 2014 文章目录 1. 原始时代最简单的oo实现 2. 石器时代的oo实现 3. 工业时代 ...
- 【PHP开源产品】Ecshop的商品筛选功能实现分析之一
一.首先,说明一下为什么要对category.php文件进行分析. 原因如下: ①个人对商城类商品筛选功能的实现比较好奇: ②对商城中关于商品的数据表设计比较感兴趣.(该功能涉及到与数据库的交互,而且 ...
- Bootstrap 2.3.2学习
1.下载架包,下载编译好的文件,文件目录结构如下所示: bootstrap/ ├── css/ │ ├── bootstrap.css │ ├── bootstrap.min.css ├── js/ ...