多线程--线程间通信
 对同一个资源进行处理,但是任务却不同

线程间通信--等待唤醒机制
 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的更多相关文章

  1. 【译】Java SE 14 Hotspot 虚拟机垃圾回收调优指南

    原文链接:HotSpot Virtual Machine Garbage Collection Tuning Guide,基于Java SE 14. 本文主要包括以下内容: 优化目标与策略(Ergon ...

  2. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  3. Java EE (14) -- SSH配置

    整合Spring与Struts1的三种方法总结 无论用那种方法来整合,第一步都是要装载spring的应用环境,有三种方式: #1. struts-config.xml <?xml version ...

  4. JAVA进阶14

    间歇性混吃等死,持续性踌躇满志系列-------------第14天 1.线程的加入 package code0328; import javax.swing.*; import java.awt.* ...

  5. Java虚拟机14:类加载器

    类与类加载器 虚拟机设计团队把类加载阶段张的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这 ...

  6. java基础14 多态(及关键字:instanceof)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  7. Android开发基础(java)14

    Java语言与其他编程语言的最大不同之处在于:java有专门的异常处理机制,实现对各类异常情况进行有效控制. 一.基本概念:异常和错误的区别与联系: (1).定义形式不同:异常为exception:错 ...

  8. linux(centos8):安装java jdk 14 (java 14.0.2)

    一,下载jdk14 官方网站: https://www.oracle.com/java/ 下载页面: https://www.oracle.com/cn/java/technologies/javas ...

  9. Thinking in Java——笔记(14)

    Type Information The need for RTTI Because it is a dynamically bound method, the proper behavior wil ...

  10. Java 第14章 字符串

    字符串 基本数据类型和引用数据类型作为方法参数 ,在传递时有什么不同之处. 答:基本数据类型按值传递,相当于复制了一份过去. 引用数据类型是指向引用 内存地址,两个地方 根据地址使用同一份数据,如被更 ...

随机推荐

  1. py2.7+pyqt4开发端口检测工具

    使用工具:python2.7,pyqt4,pyinstaller,pywin32 先贴代码 import sys from PyQt4 import QtGui,QtCore import threa ...

  2. SpringMVC使用静态资源

    1.Servlet配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  3. shp地图解析(不用AE)

    AE太重型,还收费,如果只是加载地图作为底图,可以用纯C#实现.线类型用得最多,以下是线类型的数据结构: 总体架构 文件头 记录头 记录内容 记录头 记录内容 ............ 记录头 记录内 ...

  4. 《你是我的小羊驼》游戏源码 v1.0

    游戏分析三个界面基本上就是整个游戏的全部内容:1.左边的是主界面,展示游戏名称以及主角,让玩家对游戏的整体画风有个大概的印象.2.中间的是游戏界面,点击空格防止橙色六边形砖块来围堵小羊驼.3.右边的是 ...

  5. wp仿系统截图

    wp上直接调用CameraCaptureTask,并没有参数设置截图大小,刚好项目需求要截成正方型,于是写了个仿系统截图的demo出来. 截图如下:     需要做的逻辑运算为: 1.初始化照片时:判 ...

  6. Memento

    #include <iostream> #include <string> using namespace std; class Memento { public: Memen ...

  7. JavaScript常用标签和方法总结

    什么是javascript?   (1) JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的 脚本语言. (2) JavaScript是由Nets ...

  8. php无法加载Memcache缓存模块问题及Memcache的安装

    今天早上去迁移网站发现打开网站报错 然后我去phpinfo.php看了一下,果然我的测试页里面有加载到Memcache这个模块,如下图: 这时候,既然发现了问题的所在我们就要去排查问题,当前这个问题呢 ...

  9. [leetcode]_Reverse Integer

    经历了三道树的题后,完全崩溃中,急需一道非树图的题来挽救信心. 题目:反转数字.input : 123 , output : 321. 思路:直接,没什么好说的. 自己代码:很龊,有大量的冗余信息,还 ...

  10. nginx php 安装

    .选定源码目录选定目录 /data/klj/ cd /data/klj/ 2.安装PCRE库cd /data/klj/wget ftp://ftp.csx.cam.ac.uk/pub/software ...