ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-8-4 第八组 曹雨

2022-08-04 19:02:42  阅读:158  来源: 互联网

标签:曹雨 Lock park 第八 阻塞 任务 线程 2022 创建


LockSuppport工具类:(线程阻塞的工具类)

所有的方法都是静态方法,可以让线程在任何位置阻塞之后也有唤醒的方法。

park与parking:

如果我们把Thread看成一辆车,park就是把车停下,unpark就是让车开走。

 public static void main(String[] args) throws InterruptedException {
    Runnable runnable = () ->{
      synchronized (OBJ){
          System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
          LockSupport.park("我被阻塞了");
          if (Thread.currentThread().isInterrupted()){
              System.out.println("被中断了");
          }
          System.out.println("继续执行");
      }
    };

1、park不需要获取某个锁
2、因为中断park,不会抛出异常,需要在park之后自行判断中断状态,然后再做额外的处理
3、类似于wait,和notify,不能与他们交叉使用
4、他们两个不会涉及死锁
5、block的作用是看到对象的信息

Lock锁:

 Lock lock = new Lock() {
    @Override
    public void lock() {
        try {
            //正常处理异常的解决方案
        }catch (Exception e){
            //出现异常的解决方案
        } finally {
          //手动释放锁
          lock.unlock();
        }
    }

sychronized和Lock的区别:
Lock以下功能是synchronized不具备的!
ReentrantReadwriteLock :
对于一个应用而言,一般情况下读操作远远多于写的操作,如果仅仅是读的操作没有写的操作,数据又是线程安全,读写锁给我们提供了一种锁,读的时候可以很多线程一起读,但是不能有线程写,写是独占的,当有线程在执行写的操作,其他线程既不能读,也不能写。

并发编程三大特性:

  • 原子性:原子操作可以是一个步骤,也可以是多个步骤,但是顺序不能乱也不可以被切割只执行其中的一部分,将整个操作视为一个整体。原子性不仅仅是多行代码,也可能是多条指令。
  • 可见性:
  • 有序性:
    synchronized lock:可以保证原子性,可见性,有序性。

线程池:

为什么要创建线程池?

  • 降低资源消耗
  • 提高响应速度,任务到达时,不需要创建线程就能运行
  • 提高线程的可管理性

JDk自带的四种线程池可通过Excutors提供的。

  • 1、newcachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程;若无可回收,则新创建线程

  • 2、newFixedThreadPool:创建一个定长线程池,如果线程池的数量超过最大可并发数,则会在开始等待

  • 3、newScheduledThreadPooL:创建一个定长线程池,支持定时及周期性执行任务

  • 4、newsingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照顺序执行。
    四种线程的初始化都调用了同一种构造器:

        ThreadPoolExecutor(int corePoolSize,
                           int maximumPoolSize,
                           long keepAliveTime,
                           TimeUnit unit,
                           BlockingQueue<Runnable> workQueue,
                           ThreadFactory threadFactory,
                           RejectedExecutionHandler handler)
    

参数的意义(重要):

  • corePoolSize:线程池里线程的数量,核心线程池大小
  • maximumPoolSize:指定了线程池里的最大线程数量
  • keepAliveTime:当线程池线程数量大于corePoolSize,多出来的空闲线程,多长时间被销毁
  • unit:时间单位
  • workQueue:任务队列,用于存放提交但是尚未被执行的任务
  • threadFactory:线程工厂,用来创建线程,线程工厂就是我们new线程的
  • handler:拒绝策略,是将任务添加到线程池中时,线程池拒绝该任务多采取的相应的措施。

常见的工作队列:

  • ArrayBlockingQueue:基于数组的有界阻塞队列。FIFO。
  • LinkedBlockingQueue:基于链表的有界阻塞队列。FIFO

线程池提供了四种拒绝策略:

  • AbortPolicy:直接抛出异常,默认的策略。
  • CallerRunPolicy:用调用者所在的线程来执行任务
  • DiscardOldestPolicy:丢弃阻塞队列中最靠前的任务,并执行当前任务
  • DiscardPolicy:直接丢弃任务

重点掌握:

  • 1.创建线程的4种方式*****
  • 2.线程同步(synchronized,ReentrantLock,ReentrantReadWriteLock)*****
  • 3.线程之间的通信(wait,notify,notifyAll)*****
  • 4.线程类的常用方法***
    指令重排,线程争抢,可见性,原子性,volatile关键字

总结:

多线程的学习,在今天结束了。感觉知识点很多,很杂。有关于锁的部分,在老师这几天的演示中,我看到了好多种锁的方式,感觉有些搞不清楚。对锁的理解也不是特别的透彻,只知道锁是为了让一个线程工作时,另一个线程不工作。但是具体的多种用法,搞得不是很清楚。

标签:曹雨,Lock,park,第八,阻塞,任务,线程,2022,创建
来源: https://www.cnblogs.com/figh466/p/16549779.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有