【定义线程】
1、扩展java.lang.Thread类,实现run()方法,直接调用start()方法。
2、实现java.lang.Runnable接口,然后传递给Thread对象,调用start()方法。
【线程模型】
每个线程有一个自己的栈。
【线程的状态】
1、线程睡眠是帮助所有线程获得运行机会的最好方法。sleep()是静态方法,只能控制当前正在运行的线程。
2、线程的让步是通过Thread.yield()来实现的。线程优先级为1~10之间的正整数。
线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。(和Windows API Sleep一样)线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
【线程同步】
1、join()方法。
保证当前线程停止执行,直到该线程所加入的线程完成为止。join()方法可以设置超时时间间隔。
2、对象锁。
Java中每个对象都有一个内置锁。当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁。(这点相当别扭)
只能同步方法,而不能同步变量和类。(极其恶心)
在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。例如:
可以同步静态方法。
静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在该类的对象上。