多线程&JUC
一、线程
二、并发与并行
三、多线程的实现方式
1、继承Thread类的方式进行实现
2、实现Runnable接口的方式进行实现
注意此时需要通过Thread.currentThread()方法获取当前的线程然后再获取线程名
3、利用Callable接口和Future接口方式实现
4、三种实现方式的对比
前两种不能获取运行结果,但是第三种可以
四、线程的常见成员方法
1、如果是第一种方式实现的多线程,使用构造方法设置名字时,MyThread类中必须在构造方法中调用父类的构造方法进行命名
2、优先级线程只是一种概率,优先级大运行的概率大,并不是绝对的
3、当其他的非守护线程结束以后,守护线程会陆续的结束(不是突然结束,而是慢慢陆续结束,可能再运行一会儿)
4、礼让线程,表示当前的线程让出CPU的执行权,再次让所有线程进行抢占,可能还是当前线程再抢占到,所以也是一种概率,礼让后,该线程的运行概率会有所下降
5、插入线程,表示当前的线程被插入的线程插队,必须要插入线程完成之后才会继续执行当前的线程
五、线程的生命周期
六、同步代码块
1、注意同步代码块必须要在while循环的里面,否则当一个线程进入同步代码块时一定会将里面的内容执行完毕,也就是一个窗口卖完了所有的票
2、两个线程的锁必须是同一把锁,通常如上图中写锁
3、注意这里面的票必须要是静态的,这样才表示线程卖同样的一百张票,否则就是分别卖一百张了
七、同步方法
1、先写同步代码块,然后抽取出方法最简单
2、StringBuilder相比于StringBuffer而言,前者多线程不安全,后者都是同步方法,线程安全
八、lock锁
1、注意锁必须是惟一的
2、注意break最后跳出循环时可能会跳过解锁操作,所以通过try——catch中的finally来进行善后,保证最后一定解锁使程序结束
九、死锁
写代码的时候不要进行锁嵌套
十、生产者和消费者
常见方法
1、要创建一个共同的锁
2、注意等待的时候需要通过锁来等待,表示和这个锁绑定,从而方便后续的唤醒
3、唤醒只需要在刚吃完,或者刚做完的时候即可覆盖所有的情况,不要重复
4、唤醒需要使用锁,并且用notifyAll()方法唤醒所有与锁绑定的线程
十一、阻塞队列