线程:创建、就绪、运行、阻塞、终止
线程中断结束:
不能使用interrupt()或stop()方法,可通过在线程实现类中,设置一个boolean类型开关控制
Thread类方法:
currentThread(): 当前线程对象
sleep(long milisec):
yield(): 暂停当前执行的线程对象,并执行其他线程
Thread对象方法:
interrupt(): 中断线程。只是这种中断,是不安全的,会导致未来得及关闭的资源无法关闭
stop(): 结束线程,比interrupt()更暴力
join(): 将t线程合并到当前线程,等待t线程终止,再继续向下执行。相当于方法调用
setPriority(): 更改线程优先级
MIN_PRIORITY = 1
NORM_PRIORITY = 5
MAX_PRIORITY = 10
Object对象方法:
wait(): 导致当前线程等待,指导其他线程调用此对象的notify()或notifyAll()方法
notify(): 唤醒在此对象监视器上等待的单个线程
notifyAll(): 唤醒在此对象监视器上等待的所有线程
wait()和sleep()的区别:
相同点: 都是让当前线程进入等待状态
不同点: wait()后,锁不归我所有,必须等待被唤醒才能去抢锁
sleep(),锁还是归我所有,一段时间后自动醒来
synchronized: 保证同一时间只能由一个线程访问同一资源
死锁:互斥、占有等待、非剥夺、循环等待
public class DeadLockTest implements Runnable { int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public void run() { System.out.println(flag); if (flag == 1) { synchronized (o1) { try { Thread.sleep(1000); System.out.println("o1"); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println("1"); } } } if (flag == 0) { synchronized (o2) { try { Thread.sleep(1000); System.out.println("o2"); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println("0"); } } } } public static void main(String[] args) { DeadLockTest t1 = new DeadLockTest(); DeadLockTest t2 = new DeadLockTest(); t1.flag = 1; t2.flag = 0; new Thread(t1).start(); new Thread(t2).start(); } }
避免死锁:
1. 让所有线程按同样顺序获取一组锁,可消除a和b拥有者分别等待对方资源的问题
2. 将多个锁组成一组放到同一锁下面。
3. 将那些不会阻塞的资源用变量标识出来。
public class DeadLockResolved extends Thread { static Object o1; static Object o2; public void run() { synchronized (this) { try { Thread.sleep(1000); System.out.println("o1"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("o2"); } } public static void main(String[] args) { DeadLockResolved d1 = new DeadLockResolved(); DeadLockResolved d2 = new DeadLockResolved(); d1.start(); d2.start(); } }