多线程和Timer类

                   [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毫秒再执行


834344afa40f4bfbdfe00520014f78f0f7361856        修改鼠标悬浮提示


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章