定时线程:
机制:在固定时间内,反复执行某个任务 父类是TimerTask
字母和上面日期匹配
爬虫
多线程同步:保证多线程访问的安全 多线程访问安全就是保证 多线程执行顺序的安全
1. 多线程的启动是由JVM调度执行的,不是由程序员或者代码保证。
2. 程序员在多线程进入到运行状态(run)时,对多线程执行的控制,这个控制绝对的。
同步机制就是保证一个线程 执行完毕后,另外一个线程再执行 绝对保证
同步关键字:synchronized 保证线程安全
sunchronized 英文翻译同步,也叫做暗锁
例1:
结果:
例2:没有保证线程安全,因为没有持有同一个对象锁
继承Thread 用了synchronized没有保证线程安全,主要是需要持有同一个对象锁。(多线程安全前提是同一个对象)
解决方法:
new 使用一次 锁必须是同一个对象
start和end没必要锁,锁定范围太大,导致执行性能降低。
总结:
synchronized 叫做同步,同步保证多线程执行安全,安全的前提:多个线程必须持有同一个对象锁
synchronized 叫做锁,叫做暗锁 锁的住条件前提:必须是同一个对象
synchronized两种用法:
synchronized 修饰方法:同步方法 锁定范围太大,执行性能降低
synchronized 同步块
暗锁会自动释放,也可以叫自动释放锁。
实际使用推荐用同步块,可以缩小锁的范围(导弹精确制导)
修饰方法的例子(见上面)
同步块的例子(见下面):
创建了两个线程对象所以不可以
不一定用this:
同步块后面释放锁
或者这个:
.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
多线程竞争造成了线程不安全:
有一个线程没计算完。
用synchronized锁:
1.同步方法:
2.同步块:
* 线程生命周期:
* 1. 创建线程 new 线程对象
*
* 2. 线程进入到可运行状态 start()
*
* 3.线程进入到运行状态
*
* 4. 线程进入到运行状态对线程的状态调度
* sleep() yeild() join()
* synchronized
* wait()/notify()
*
* 5. 线程死亡
线程通信:线程之间交互数据
*
* 1. 主线程向子线程通信传递数据 实现机制:构造函数
*
* 2. 子线程向主线程通信传递数据 子线程合并到主线程(join)
* 实现机制 :synchronized wait()/notify()
wait()/notify()一定要在synchronized同 步机制下
*
*
* 3. 子线程和子线程通信传递数据
wait() /notify() 一定要在synchronized同步机制下
主线程安排子线程做一个耗时计算,主线程获取子线程计算的结果。
join()本质是把子线程合并到主线程来计算,所以不符合
去计算1-100之和:
this.notify():通知和它持有同一个对象是锁的被wait的线程继续执行。
如果持有的是当前子线程对象的锁,this.notify();可以不写,默认是有的。
必须要是持有同一个对象的锁:
下图,出现了死锁现象
要把object通过构造函数传过去,这就是主线程向子线程传值:
这就是线程的通信 ,与join( )不同。
一个线程打印奇数和偶数,负载很大
分成两个线程 分别打印 奇偶交替 负载均衡 :
为了让这两个线程持有同一个对象,创建一个类:
只要是 if() 语句,只有()中的boolean为true时,才能执行if()语句下面的{},如果为false时,执行else下面{};