Java Day 14

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

线程间通信--等待唤醒机制
 1、wait();   线程处于冻结状态,被wait线程存储在线程池中
 2、notify(); 从线程池唤醒一个线程
 3、notifyAll(); 唤醒所有线程
 方法必须定义在同步中

为什么操作线程的方法wait notify notifyAll定义在Object类中
  因为这些方法是监视器的方法,监视器其实就是锁
  锁可以是任意的对象,任意的对象调用的方式一定是定义在Object类中

唤醒--代码优化

多生产者多消费者
 
多生产多消费者问题解决
 notifyAll();
 
 while判断标记,解决了线程获取执行权后是否重新运行
 
 notifyAll()解决了本方线程一定唤醒对方线程

多生产多消费问题 JDK1.5新特性 -- Lock
 同步代码块,对于锁的操作是隐式的。

 1 import java.util.concurrent.locks.*;
 2 //import java.util.condition;
 3 class Resource{
 4     private String name;
 5     private int count = 1;
 6     private boolean  flag = false;
 7     Lock lock = new ReentrantLock();
 8     //Condition c1 = lock.newCondition();
 9     Condition pro_con = lock.newCondition();
10     Condition cos_con = lock.newCondition();
11
12     Resource(){}
13
14     public void set(String name){//synchronized
15         lock.lock();
16         try{
17             while(flag)//while(flag)--死锁
18                 //try{wait();}catch(InterruptedException e){}
19                 try{pro_con.await();}catch(InterruptedException e){}
20             this.name = name + count;
21             count++;
22             System.out.println(Thread.currentThread().getName()+": 生产..5.0.  "+this.name);
23             flag = true;
24             //notifyAll();//notifyAll()
25             //c1.signalAll();//notifyAll()
26             cos_con.signal();//notifyAll()
27         }
28         finally{
29             lock.unlock();
30         }
31
32
33     }
34
35     public  void out(){ //synchronized
36         lock.lock();
37         try{
38             while(!flag)//while(flag)--出现死锁--notifyAll()
39                 try{cos_con.await();}catch(InterruptedException e){}
40             System.out.println(Thread.currentThread().getName()+":...消费了......"+name);
41             flag = false;
42             //notifyAll();//notifyAll()}
43             //c1.signalAll();
44             pro_con.signal();
45
46         }
47         finally{
48             lock.unlock();//notifyAll()
49         }
50     }
51 }
52
53 class Producer implements Runnable{
54     private Resource r;
55     Producer(Resource r){
56         this.r = r;
57     }
58
59     public void run(){
60         while(true){
61             r.set("烤鸭");
62         }
63
64     }
65 }
66
67 class Consumer implements Runnable{
68     private Resource r;
69     Consumer(Resource r){
70         this.r = r;
71     }
72     public void run(){
73         while(true){
74             r.out();
75         }
76     }
77 }
78
79 class ProduceConsumerDemo{
80     public static void main(String[] args){
81         Resource r = new Resource();
82         Producer pro = new Producer(r);
83         Consumer con = new Consumer(r);
84
85         Thread t0 = new Thread(pro);
86         Thread t1 = new Thread(pro);
87         Thread t2 = new Thread(con);
88         Thread t3 = new Thread(con);
89
90         t0.start();
91         t1.start();
92         t2.start();
93         t3.start();
94
95     }
96 }

将同步和锁封装成了对象

JDK1.5新特性--condition
 wait notify notifyAll

JDK1.5解决方法
 一个锁多个监视器

范例
 Lock 接口:替代了同步代码块或同步函数,由隐式锁操作变成显示
  lock()   获取锁
  unlock() 释放锁 在finally代码块中

Condition 接口 替代了Object中的wait notify notifyAll方法,单独进行封装
  await
  signal
  signalAll

 1  class BoundedBuffer {
 2    final Lock lock = new ReentrantLock();
 3    final Condition notFull  = lock.newCondition();
 4    final Condition notEmpty = lock.newCondition();
 5
 6    final Object[] items = new Object[100];
 7    int putptr, takeptr, count;
 8
 9    public void put(Object x) throws InterruptedException {
10      lock.lock();
11      try {
12        while (count == items.length)
13          notFull.await();
14        items[putptr] = x;
15        if (++putptr == items.length) putptr = 0;
16        ++count;
17        notEmpty.signal();
18      } finally {
19        lock.unlock();
20      }
21    }
22
23    public Object take() throws InterruptedException {
24      lock.lock();
25      try {
26        while (count == 0)
27          notEmpty.await();
28        Object x = items[takeptr];
29        if (++takeptr == items.length) takeptr = 0;
30        --count;
31        notFull.signal();
32        return x;
33      } finally {
34        lock.unlock();
35      }
36    }
37  }

wait sleep 区别
 1、wait可以指定时间也可以不指定,sleep必须指定
 2、在同步中,对cpu的执行权和锁的处理不同
    wait 释放执行权和锁
    sleep 释放执行权 不是释放锁

停止线程方式--定义标记
 1、stop方法
 2、run方法结束
 怎么控制线程的任务结束呢?
  控制循环就可以结束任务

停止线程方式--Interrupt
 如果线程处于冻结状态,无法读取标记,如何结束?
 interrupt 将线程从冻结强制恢复成运行状态,但会发生中断异常

守护进程--setDaemon
 后台线程,先于线程启动前调用

join方法
 setPriority(Thread.MAX_PRIORITY)
 
 yield

时间: 2024-12-14 09:07:14

Java Day 14的相关文章

老白的JAVA课程14 GUI 窗口的设置

项目驱动 需求分析-系统设计-编码-测试-维护期 GUI Swing程序的建立步骤 1.建立容器-可以容纳其他图形对象的类,容器中还可以添加容器 2.建立组件-组件就是一套图形对象 3.将组件放到容器当中-将创建好的对象添加到容器中,才能在窗口中显示 4.设置布局 JFrame:带有标题和边框的顶级窗口 JPanel:就是一个矩形的区域,其中可以包含图形组件,也可以包含其他JPanel JApplet:在浏览器中运行的容器 JScrollpane:一种可以实现水平或垂直滚动条的容器 JDiolo

Java基础14:离开IDE,使用java和javac构建项目

Java基础14:离开IDE,使用java和javac构建项目 javac命令初窥 注:以下红色标记的参数在下文中有所讲解. 本部分参考https://www.cnblogs.com/xiazdong/p/3216220.html 用法: javac 其中, 可能的选项包括: -g 生成所有调试信息 -g:none 不生成任何调试信息 -g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -depr

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

原文链接:HotSpot Virtual Machine Garbage Collection Tuning Guide,基于Java SE 14. 本文主要包括以下内容: 优化目标与策略(Ergonomics) 垃圾收集器实现(Garbage Collector Implementation) 影响垃圾收集性能的因素 总堆(Total Heap) 年轻代 可用的收集器(Available Collectors) 串行收集器(Serial Collector) 并行收集器(Parallel Co

java 19 -14 File类的判断并输出案例

1 package zl_file; 2 3 import java.io.File; 4 import java.io.FilenameFilter; 5 6 /* 7 需求: 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称 8 分析: 9 两种方式: 10 A:先获取所有的,然后遍历的时候,依次判断,如果满足条件就输出. 11 a:封装h判断目录 12 b:获取该目录下所有文件或者文件夹的File数组 13 c:遍历该File数组,得到每一个File对象,然后判断 14

java 16 -14 建立产生不重复的限定个数的随机数集合

需求: 获取10个1-20之间的随机数,要求不能重复 分析: A:创建一个产生随机数的对象 B:创建一个集合来存储产生的随机数 C:判断随机数: a:定义一个count,判断随机数的个数是否小于10 1:若小于10,则进行再次判断 这个随机数是否存在:若不存在,则添加进去,若存在,则不理 2:若大于或等于10,则退出 D:对集合进行遍历输出 1 package cn_JDK5new; 2 3 import java.util.ArrayList; 4 import java.util.Rando

java 21 - 14 Properties类

类 Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 注意:Properties是Hashtable的子类,说明是一个Map集合.但是,它后面没有<>,说明它不是泛型类 首先把它当成Map使用看看: 1 Properties prop = new Properties(); 2 3 // 添加元素 4 prop.put("it002", "hello&q

Java EE (14) -- SSH配置

整合Spring与Struts1的三种方法总结 无论用那种方法来整合,第一步就是要装载spring的应用环境,有三种方式: #1. struts-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN&qu

JAVA程序设计(14.3)----- 图书馆管理系统 初步设计 界面篇~借书目录查看窗口,新书添加窗口

1.就地实例化,表格,表格滚动条,有滚动条自动出现抬头,表格model 2.新增窗口,上下调节的输入框,这种输入框中的数据获取方法,输入框部件设置,重置输入框内容 注意与主窗口通用一个BookManager--刚开始就因为在此窗口new了一个manager弄死加不进去--还不会报错---- 1 的代码先是主窗口   可以显示所有藏书 按钮2个 新增和删除  只做好了新增的 package com.lovo.ui; import java.awt.BorderLayout; import java

JAVA进阶14

间歇性混吃等死,持续性踌躇满志系列-------------第14天 1.线程的加入 1 package code0328; 2 3 import javax.swing.*; 4 import java.awt.*; 5 6 public class JoinTest extends JFrame { 7 //定义两个线程 8 private Thread threadA; 9 private Thread threadB; 10 //定义两个进度条组件 11 final JProgressB