[10]多线程和Timer类
一.多线程
*** 1.创建线程
a.定义一个类继承Thread类, 重写run()方法, 创建该类对象, 调用start()方法.
程序会开启一条新线程, 在新线程上自动调用run()方法.
b.定义一个类实现Runnable接口, 实现run()方法, 创建Thread对象, 构造函数中传入Runnable对象, 调用start()方法.
程序会开启一条新线程, 在新线程上自动调用Runnable的run()方法.
2.Thread类常用方法
a.currentThread()
获取当前线程对象
b.getName()
获取线程的名字
c.setName(String)
设置线程的名字
d.sleep(long)
控制线程休眠指定毫秒
e.setDaemon(boolean)
设置线程为后台(守护)线程, 后台线程不会单独执行. 注意, 必须在线程开启之前设置.
f.join()
当前线程暂停, 指定线程加入, 等待指定线程执行结束, 当前线程继续
* 3.同步
a.同步代码块
使用synchronized(锁对象){ 同步代码 }方式定义同步代码块
多个同步代码块如果使用相同的锁对象, 那么同一时间内只能执行一个
b.同步方法
如果整个方法内的代码都需要同步, 那么可以在方法声明上加上synchronized
在同一个对象上的同步方法, 同一时间只能执行一个
同步方法默认使用this作为锁对象
如果希望同步方法和同步代码块进行同步, 那么同步代码块也要自划定锁对象为this
c.什么时候用同步
两个线程在执行两段代码的时候, 其中一段代码执行的过程中不希望CPU切换到另一段代码.
可以将两段代码放在同步代码块中, 使用相同的锁对象, 这样同一时间内只能执行一段代码.
d.线程安全问题
当多个线程并发访问同一数据, 有可能出现线程安全问题.
这时就可以使用同步技术来解决, 将访问数据的代码放在同步代码块中, 这样做同一时间只能有一条线程访问数据.
e.死锁
在多线程并发执行的时候, 尽量避免多层同步代码嵌套使用, 有可能互相冲突, 造成死锁
4.通信
a.等待
使用锁对象的wait()方法进行等待
b.唤醒
使用锁对象的notify()方法进行唤醒, 该方法是唤醒随机一个线程
使用notifyAll()方法可以唤醒所有等待的线程
5.JDK5的同步
使用ReentrantLock类创建一个锁对象, 在需要同步的代码前执行lock()方法, 同步结束的地方unlock()
6.JDK5的通信
使用ReentrantLock可以调用newCondition()方法创建Condition对象
使用Condition对象await()方法可以控制当前线程等待
使用Condition对象的signal()方法可以唤醒指定的线程
二.Timer类
1.创建计时器
Timer timer = new Timer();
2.安排任务
schedule(TimerTask task, long delay)
安排一个任务, 等待delay毫秒后执行
schedule(TimerTask task, long delay, long period)
安排一个任务, 等待delay毫秒后执行, 每隔period毫秒再执行
schedule(TimerTask task, Date time)
安排一个任务, 等待time时间开始执行
schedule(TimerTask task, Date firstTime, long period)
安排一个任务, 等待firstTime时间开始执行, 每隔period毫秒再执行
修改鼠标悬浮提示