线程并发学习—-线程阻塞(sleep、wait、notifyAll、notify、join)

来源:互联网 发布:淘宝超级会员能干什么 编辑:程序博客网 时间:2024/05/23 01:13

线程并发学习

线程并发学习—-核心概念(转载)
线程并发学习—-线程阻塞(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 Bend A

从结果可以看出线程a先获取到 锁,getA方法调用wait方法释放锁,getB使用sleep休眠3秒,但并不释放锁,然后使用notify唤醒等待线程

参考资料
https://www.cnblogs.com/royi123/archive/2013/06/01/3113198.html

阅读全文
0 0
原创粉丝点击