- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------
1. 多线程,状态图(6个状态),创建方式,继承方式,实现接口方式。Thread构造器接收Runnable接口的实现类对象,数据共享。多线程在共享数据的操作上的安全问题,同步技术处理安全问题,synchronized 同步方法,锁是对象,方法默认就是this,静态方法就是类名.class。写单例模式懒汉式,安全和提高效率。死锁,代码背下来
2. 第二十五天学习内容:线程之间的通信,等待与唤醒机制,wait notify,多生产与多消费,JDK1.5出现了新的线程控制方式 java.util.concurrent.locks.Lock。线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,加入,让步。GUI图形化界面,AWT和Swing,窗体,布局管理器,事件监听器,适配器使用
3. 线程之间的通信
多线程操作同一共享数据
一个线程,负责给数据赋值,另一个线程打印数据
分析数据安全,解决办法,只有同步
输入,输出都使用同步技术,但是数据安全还是没解决
先看线程的共享数据,是不是都被同步了
同步中使用对象锁,是不是同一个,找程序中的唯一对象!!
实现交替输出打印,需要定义一个标记变量boolean,变量的值是true,没有数据,需要输入线程赋值,如果变量值是false,里面有数据,输入线程必须等。变量值是false,输出线程打印
wait notify 线程无限等待,唤醒等待线程,如果你要使用,必须有锁的支持,写在同步中,必须用锁调用
4. wait方法sleep区别
wait是Object类的非静态方法,sleep是Thread类的静态方法
wait必须有锁,sleep任意程序都可以调用,比需要锁
sleep不会释放锁,wait方法线程释放同步锁,当线程被唤醒的时候,必须从新获取同步锁,才能继续运行
5. 为什么线程方法等待,唤醒写了Object类
wait notify 等待,唤醒本锁上的线程,必须有锁的支持,锁是任意对象,将wait,notify方法写了Object类,保证任意对象锁都可以调用线程,等待唤醒方法
6. 多生产与多消费
多个生成线程,多个消费线程。实现生产一个,消费一个
需要资源,计数器,标记,生成线程,消费线程
多线程并发以后,等待后,被唤醒,按照等待的顺序唤醒线程,唤醒另一个方法中的线程呢,唤醒全部线程,Object类方法notifyAll唤醒全部等待的线程,被唤醒后,不会再次判断标记了,直接运行方法。必须让被唤醒后的线程,再次判断标记,如果标记不允许运行,再次进入等待状态。
以上生产与消费案例,如果使用全部唤醒的话,资源浪费严重。唤醒全部线程是浪费的,唤醒自己本方线程是没有必要的。能不能唤醒对方中的一个呢。在JDK1.4之前无法实现,但是JDK1.5之后,出现了心得方式管理线程,lock锁
7. JDK1.5中,java.util.concurrent.locks包
提供线程的新的管理方式
接口Lock,替代了原有的synchronized的使用,使用灵活广泛
接口中的方法 获取锁lock 释放锁 unlock
synchronized(this){ lock()
}unlock()
接口实现类ReentrantLock,
接口Condition 替代原有监视器方法 wait notify notifyAll
新旧方法的对比
接口中Condition Object类
await() wait()
signal() notify()
signalAll() notifyAll()
获取接口的实现类对象,用Lock接口方法newCondition实现
分解成截然不同对象
8. 线程停止方式
线程在运行中,必须让他可以停下,Thread类中有方法stop(),已经过时
结束线程最终目的,结束run方法就可以
在循环中,条件写成变量形式,可以修改变量值,让循环结束,循环结束,意味着方法run也就结束了
如果线程处于wait状态,让线程停止呢
Thread类的方法interrupt()
有个朋友失眠很严重,我替他找你个超级的催眠大师,很快,就让我这个朋友睡觉了。催眠师说,我催眠的人,除了我以外,谁也叫不醒。催眠师突发心脏病死了。发现其他任何人都不能叫醒我的朋友,找个板砖,打一下,朋友打醒,用力过猛,脑袋流血了,这个朋友出现了异常。
朋友相当于程序中的线程,催眠师wait方法,板砖interrupt方法,处于等待中的线程会立刻抛出异常
InterruptedException线程中断异常,处于等待或者休眠中的线程,突然醒来,非正常醒来,抛出这个异常
9. Thread类的toString方法
打印线程对象,调用线程的toString方法
Thread[Thread-0,5,main]
[]里面的信息 Thread-0线程的名字 5线程的优先级 main所属组,主线程组
优先级,Java中的线程,有三种优先级,最高,默认,最低,Thread类中用三个静态常量表示线程的优先级,优先级越高,线程在某一时刻运行的更多些
MAX_PRIORITY =10 NORM_PRIORITY =5 MIN_PRIORITY=1
setPriority(int newPriority)
设置线程的优先级
10. 守护线程
Thread类的方法setDaemon(true)这个线程,标记为守护线程
必须写在start之前
圣斗士星矢动画片:星矢,智慧女神雅典娜,雅典娜手下88个圣斗士。圣斗士的存在意义守护雅典娜,雅典娜死了,圣斗士也就没有存在的意义,圣斗士就是雅典娜的守护线程。
Java中的定时器,java.util.Timer定时器,可以让程序指定时间间隔后,运行
Timer构造方法,传递参数,false
Timer类的方法schedule(TimerTask task, Date firstTime, long period)定时器要运行的程序,开始时间,间隔时间
第一个参数需要运行的程序
第二个参数是开始时间
第三个参数间隔的毫秒值
第一个参数是TimerTask类型,是一个抽象类,子类继承抽象类,重写run方法,传递子类的对象
11. Thread类方法join
等待该线程终止
使用了join方法的线程,会一直运行结束,其他线程抢CPU的资源
t0 join方法 ,结束后,t1 main争夺资源
12. Thread类静态方法yield
线程的让步,方法要写在线程运行的代码中,写run
多线程程序,出现线程之间相互谦让,不肯运行的效果
13. 图形界面概述
人机交互:GUI方式,图形界面交互,CMD方式,命令模式
图形界面的好处:方便,直观,复杂的事情变简单操作
CMD:记忆命令,使用不方便,不直观
用户用着越爽,开发者就越痛苦
Java的图形界面存在于两个包中java.awt javax.swing
14. awt和swing的区别
awt 依赖于操作系统,调用操作系统功能实现图形界面,重量级组件
swing 基于awt基础之上,完全由Java语言自己实现图形界面,不依靠操作系统,属于轻量级组件。
使用awt制作的界面,界面效果跟随操作系统的变化而变化
使用swing制作,不跟随系统的变化而变化
15. awt中的继承体系
Component是图形界面的顶层类
分成两个派系
容器,窗体,容器中可以放容器和组件。Frame窗体,Dailog对话框
组件,Button按钮 Label标签 checkbox复选框 TextArea文本区域 TextField单行文本
16. Frame窗体
使用Frame类实现一个窗体
构造器,空参数,带有一个String参数,窗体的标题
Frame类的常见方法
l setVisible(true)窗体设置隐藏或者可见,参数是真,可见,参数是假,不可见
l setBounds(int 横坐标,int 纵坐标,int 宽度,int高度)设置窗体的大小和位置。横坐标:窗体的最左侧,距离屏幕的位置。单位是像素
l setBackground(Color c)设置组件的背景色
17. 获取屏幕分辨率
每个屏幕分辨率不同,必须获取到准确的像素,才能定位
java.awt.ToolKit,静态方法ToolkitgetDefaultToolKit返回这个类的子类对象
ToolKit方法 Dimension getScreenSize()获取到屏幕分辨率。
Dimension类成员变量hight width 都是int类型,屏幕分辨率
18. 布局管理器
很多的组件,按钮,文本,放置在窗体上,组件如何的排列组合,使用布局管理器对组件进行位置的管理
很多布局管理器,对组件按照自己的方式来控制,我的按钮,想放哪就放哪,不按照布局方式排列。必须将容器的默认布局管理器取消,调用窗体方法setLayout(null)取消的布局管理器,如果取消了布局管理器,组件必须有定位和尺寸,否则不显示
19. Button组件
Button类,描述按钮的类,构造方法中,传递一个String标签,传递的标签字符串就会出现在按钮上。将按钮放在窗体上,用窗体的方法add添加
20. 事件监听机制
事件源:凡是用户能操作的组件,都是事件源
事件:用户的具体操作,鼠标(单,双,右键,轮,拖动,移入,移出),键盘(按下,弹起,按住不放),窗体(打开,关闭,最大,最小化)
监听器:窃听器。监听用户的操作,只要你有事件的动作,都会被我监听器捕获到,等待用户的事件操作。
事件处理:监听器捕获到事件发生后,调用方法处理这个事件,处理时间方式就是一个方法的实现。
人的事件监听机制,人等着挨打。
事件源是人,事件的挨打事件,人在等待挨打,只要有人打我,我就会立刻感觉到,相当于监听器捕获到,根据被打的严重程度,调用不同的处理方式,就是多个方法,如果打的很轻,调用不处理方法,打的很重,调用去医院的方法
21. 使用事件监听机制,实现窗体的关闭效果
事件源是谁: 窗体
事件:关闭事件
监听器:需要自己调用方法完成
处理方法:
Frame窗体中,有一个方法addWindowsListener 注册一个窗体的事件监听器。方法的参数WindowListener是一个接口。存在与java.awt.event包
WindowListener接收窗体事件的接口,windowClosing方法,关闭的时候,由事监听器自动调用
22. 适配器的设计模式
手机充电器:电源适配器
手机电池3.7 电源220 -- 适配 -- 3.7
将接口中的方法,适配成用户想要的方法,接口的空实现
interface A{}
abstract AImp implements A{
//重写,方法,但是方法中,没有具体代码
}
继承抽象类,想用哪个方法,就重写哪个方法,没有必要重写接口中的全部
图形界面中,写事件监听器的标准格式写法
事件源.addXXXListener(newXXXAdapter(){
public void 需要的方法(XXXEvente){
}
})