06 线程、同步
主要内容
- 线程
- 同步
- 线程状态
第一章 线程
1.1创建线程方式:
- 自定义类继承Thread类
- 自定义类实现Runnable接口
1.2Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易实现资源共享。
实现Runnable接口比继承Thread类所具有的优势:
*1.适合多个相同的程序代码的线程去共享同一个资源。
2.可以避免java中的单继承的局限性。
3.增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
4.线程池只能放入实现Runnable或Callable类线程,不能直接放入继承Thread的类。
ps:在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用 java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进 程
1.3匿名内部类的方式创建线程
new Thread(new Runnable(){
public void run(){
//重写方法体
}
}).start();
第二章 线程安全
2.1 线程安全
我们通过电影院卖票案例,演示线程的安全问题:
发现程序出现了两个问题:
1.相同的票数,比如5这张票被卖了两回。
2.不存在的票,比如0票与-1票,是不存在的
2.2 线程同步
- 同步代码块。
- 同步方法。
- 锁机制。
第三章 线程状态
3.1 线程状态概述
java.lang.Thread.State 这个枚举中给出了六种线程状态:
-
Enum Constant and Description BLOCKED
一个线程的线程状态阻塞等待监视器锁定。NEW
线程尚未启动的线程状态。RUNNABLE
可运行线程的线程状态。TERMINATED
终止线程的线程状态。TIMED_WAITING
具有指定等待时间的等待线程的线程状态。WAITING
等待线程的线程状态
ps:TIMED_WAITING中的wait方法是带参的。这种设计方案是很巧妙的,如果线程没有得到唤醒通知,那么就处于TIMED_WAITING状态,直到倒计时完毕自动醒来;如果在倒计时期间得到唤醒通知,那么线程从TIMED_WAITING立刻被唤醒。