java多线程的理解
线程的5种状态:新建,就绪,运行,阻塞,死亡。
Thread.sleep:线程 运行状态 转为 阻塞状态,(其它线程启动运行)
Thread.yield: 线程 运行状态 转为 就绪状态,(同优先级线程启动运行)
ThreadA.join:等待ThreadA执行完成。
线程的两种方式:
继承自Thread,实现Runnable.
在线程中看是否有操作的同一对象的实例。如果有的话要考虑线程的同步和互斥。通俗点来说就是某个类的某个成员变量会有多个线程访问。
线程的同步:
同步代码块:同步加锁的是对象,而不是代码。
synchronized(Object A){
}
同步监视器是A,表示的是一个临界区。
同步方法:
synchronized Method1(){
}
synchronized Method2(){
}
同步锁:
Lock lock = new ReentrantLock();
public Mehtod1(){
lock.lock();
finally{
lock.unlock();
}
}
public Mehtod2(){
lock.lock();
finally{
lock.unlock();
}
}
同步监视器的释放:
1.当前线程的同步方法或者同步代码块执行结束,当前线程即释放同步监视器。
2.在同步方法或者同步代码块中出现了error或者exception的时候。
3.当线程执行同步方法或者同步代码块时,程序执行了同步监视器对象的wait方法,则当前线程,并释放同步监视器。
下面的情况不会释放同步监视器:
1.当线程执行同步方法或者同步代码块时,程序调用Thread.Sleep,Thread.Yield方法。
2.当线程执行同步方法或者同步代码块时,其他线程调用了该线程的suspend方法将该线程挂起。
线程的通信:
同步方法块或者同步方法使用object的wait,notify和notifyAll三个方法来进行线程的通信。
如果是同步方法块synchronized(Object a):则在代码中要使用a.wait,a.notify,a.notifyAll;
如果使用的是同步方法synchronized methodA(),则同步监视器是this对象,可以直接在代码中使用wait,notify和notifyAll方法。
wait:导致当前的线程等待,并且释放当前的同步监视器。直到其他线程调用该同步监视器的notify方法和notifyall方法。
notify:唤醒在此监视器上等待的单个线程,但是选择是任意的。
notifyAll:唤醒在同步监视器上等待的所有线程。