线程并发学习
线程并发学习—-核心概念(转载)
线程并发学习—-线程阻塞(sleep、wait、notifyAll、notify、join)
线程并发学习—-线程阻塞(synchronized)
线程并发学习—-线程阻塞(lock)
线程并发学习—-Thread、Runnable、Callable
线程并发学习—-队列(Queue)
spring学习—-线程池
java中一些锁概念整理(转载)
比较
- 两者来自不同的类(分别是Thread和Object)
- sleep方法没有释放锁;而wait方法释放了锁,使得其他线程可以使用同步控制块或方法
- wiat只能在同步控制方法或者同步控制块使用,而sleep可以在任何地方使用
- sleep必须捕获异常,而wait不需要
- notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级
- notifyAll()则能唤醒全部等待线程
- join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B
示例
public class WaitDemo {
public static void main(String[] args) {
WaitDemo waitDemo = new WaitDemo();
new Thread(new Runnable() {
@Override
public void run() {
waitDemo.getA();
}
}).start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
waitDemo.getB();
}
}).start();
}
public synchronized void getA() {
System.out.println("get A.....");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end A");
}
public synchronized void getB() {
System.out.println("get B.....");
try {
Thread.sleep(3000);
notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end B");
}
}
结果
get A.....
get B.....
end B
end A
从结果可以看出线程a先获取到 锁,getA方法调用wait方法释放锁,getB使用sleep休眠3秒,但并不释放锁,然后使用notify唤醒等待线程
参考资料
https://www.cnblogs.com/royi123/archive/2013/06/01/3113198.html