当前位置: 首页 > news >正文

山东宏福建设集团有限公司网站ui界面设计培训班

山东宏福建设集团有限公司网站,ui界面设计培训班,郴州市人口,项目管理的主要内容包括哪些并行和并发的区别#xff1f;#xff08;1#xff09;并行是指两个或者多个事件在同一时刻发生#xff1b;而并发是指两个或多个事件在同一时间间隔发生#xff1b;#xff08;2#xff09;并行是在不同实体上的多个事件#xff0c;并发是在同一实体上的多个事件#…并行和并发的区别1并行是指两个或者多个事件在同一时刻发生而并发是指两个或多个事件在同一时间间隔发生2并行是在不同实体上的多个事件并发是在同一实体上的多个事件线程和进程的区别进程是程序运行和资源分配的基本单位一个程序至少有一个进程一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元而多个线程共享内存资源减少切换次数从而效率更高。线程是进程的一个实体是cpu调度和分派的基本单位是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。创建线程的几种方式1. 继承Thread类1创建一个继承于Thread类的子类2重写Thread类的run()将此线程要执行的操作声明在run()中3创建子类对象4通过此对象调用start()启动当前线程调用当前线程的run()2. 实现Runnable接口1创建一个实现了Runnable接口的类2实现类去重写Runnable中的run()方法3创建实现类的对象4创建Thread类的对象将实现类的对象作为参数传递到Thread类的构造器中5通过Thread类的对象调用start()。3. 通过实现Callable接口1创建Callable接口的实现类并实现call()方法该call()方法将作为线程执行体且该call()方法有返回值。然后再创建Callable实现类的对象2使用FutureTask类来包装Callable对象FutureTask对象封装了Callable对象的call()方法的返回值3使用FutureTask对象作为Thread对象的target创建并启动新线程4调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。run()和start()有什么区别run()方法被称为线程执行体它的方法体代表了线程需要完成的任务每个线程都是通过某个特定Thread对象所对应的run()方法来完成操作的。start()方法用来启动线程。调用start()方法启动线程时系统会把该run()方法当成线程执行体来处理这时无需等待run()方法体代码执行完毕可以直接继续执行下面的代码这时此线程是处于就绪状态并没有运行。但如果直接调用线程对象的run()方法系统把线程对象当成一个普通对象而run()方法也是一个普通方法而不是线程执行体。阻塞线程的方式有哪些1线程调用sleep()方法主动放弃所占用的处理器资源2线程调用了一个阻塞式IO方法在该方法返回之前该线程被阻塞3线程试图获得一个同步监视器但该同步监视器正被其他线程所持有4线程在等待某个通知5程序调用了线程的suspend()方法将该线程挂起。线程的生命周期在线程的生命周期中它要经过新建New、就绪Ready、运行Running、阻塞Blocked和死亡Dead5种状态。当程序使用new关键字创建了一个线程之后该线程就处于新建状态此时仅仅由Java虚拟机为其分配内存并初始化其成员变量的值。当线程对象调用了start()方法之后该线程处于就绪状态处于这个状态中的线程并没有开始运行只是表示该线程可以运行了。至于该线程何时开始运行取决于JVM里线程调度器的调度。如果处于就绪状态的线程获得了CPU开始执行run()方法的线程执行体则该线程处于运行状态当线程数大于处理器数时会存在多个线程在同一个CPU上轮换的现象。当一个线程开始运行后它不可能一直处于运行状态线程在运行过程中需要被中断目的是使其他线程获得执行的机会线程调度的细节取决于底层平台所采用的策略。当发生如下情况时线程将会进入阻塞状态1线程调用sleep()方法主动放弃所占用的处理器资源2线程调用了一个阻塞式IO方法在该方法返回之前该线程被阻塞3线程试图获得一个同步监视器但该同步监视器正被其他线程所持有4线程在等待某个通知5程序调用了线程的suspend()方法将该线程挂起。当发生如下特定的情况时可以解除上面的阻塞让该线程重新进入就绪状态1调用sleep()方法的线程经过了指定时间2线程调用的阻塞式IO方法已经返回3线程成功地获得了试图取得的同步监视器4线程正在等待某个通知时其他线程发出了一个通知5处于挂起状态的线程被调用了resume()恢复方法。线程会以如下三种方式结束结束后就处于死亡状态1run()或call()方法执行完成线程正常结束2线程抛出一个未捕获的Exception或Error3直接调用该线程的stop()方法来结束该线程。sleep()和wait()的区别sleep()方法让正在执行的线程主动让出cpu然后cpu就可以去执行其他任务在sleep指定时间后cpu再回到该线程继续往下执行sleep方法只让出了cpu而并不会释放同步资源锁到时间自动恢复。wait()方法则是指当前线程让自己暂时退让出同步资源锁以便其他正在等待该资源的线程得到该资源进而运行只有调用了notify()方法之前调用wait()的线程才会解除wait状态可以去参与竞争同步资源锁进而得到执行。wait()方法会放弃对象锁进入等待队列。sleep()可以在任何地方使用而wait()只能在同步方法或同步代码块中使用。sleep()不会释放锁而wait()会释放锁并需要通过notify()/notifyAll()重新获取锁。如何实现子线程先执行主线程再执行启动子线程后立即调用该线程的join()方法则主线程必须等待子线程执行完成后再执行。如何实现线程同步1使用Synchronized关键字被该关键字修饰的方法或语句块会自动被加上内置锁从而实现同步。2使用wait和notifywait()方法可以让当前线程释放对象锁并进入阻塞状态notify()方法用于唤醒一个正在等待相应对象锁的线程使其进入就绪队列以便在当前线程释放锁后竞争锁进而得到CPU的执行。3ReentrantLockReentrantLock类是可重入、互斥、实现了Lock接口的锁它与使用synchronized方法和快具有相同的基本行为和语义并且扩展了其能力。4使用特殊域变量volatilevolatile关键字为域变量的访问提供了一种免锁机制使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新。5使用可重入锁实现线程同步6使用阻塞队列实现线程同步wait、notify和notifyAll()wait()、notify()、notifyAll()用来实现线程通信这三个方法都不是Thread类中所声明的方法而是Object类中声明的方法并且被final修饰无法被重写。原因是每个对象都拥有锁所以让当前线程等待某个对象的锁所以应该通过这个对象来操作。wait()方法可以让当前线程释放对象锁并进入阻塞状态。notify()方法用于唤醒一个正在等待相应对象锁的线程使其进入就绪队列以便在当前线程释放锁后竞争锁进而得到CPU的执行。notifyAll()用于唤醒所有正在等待相应对象锁的线程使它们进入就绪队列以便在当前线程释放锁后竞争锁进而得到CPU的执行。每个锁对象都有两个队列一个是就绪队列一个是阻塞队列。就绪队列存储了已就绪将要竞争锁的线程阻塞队列存储了被阻塞的线程。当一个阻塞线程被唤醒后才会进入就绪队列进而等待CPU的调度。反之当一个线程被wait后就会进入阻塞队列等待被唤醒。synchronized关键字synchronized关键字解决的是多个线程之间访问资源的同步性synchronized 关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。synchronized关键字最主要的三种使用方式1修饰实例方法对当前对象实例加锁进入同步代码前要获得当前对象实例的锁2修饰静态方法对当前类对象加锁进入同步代码前要获得当前类对象的锁。也就是给当前类加锁会作用于类的所有对象实例因为静态成员不属于任何一个实例对象是类成员。3修饰代码块指定加锁对象对给定对象加锁进入同步代码块前要获得给定对象的锁。和synchronized方法一样synchronized代码块也是锁定当前对象的。synchronized可以修饰静态方法但不能修饰静态代码块。synchronized与Lock的区别1synchronized是Java关键字在JVM层面实现加锁和解锁Lock是一个接口在代码层面实现加锁和解锁。2synchronized可以用在代码块上、方法上Lock只能写在代码里。3synchronized在代码执行完或出现异常时自动释放锁Lock不会自动释放锁需要在finally中显示释放锁。4synchronized会导致线程拿不到锁一直等待Lock可以设置获取锁失败的超时时间。5synchronized无法得知是否获取锁成功Lock则可以通过tryLock得知加锁是否成功。6synchronized锁可重入、不可中断、非公平Lock锁可重入、可中断、可公平/不公平并可以细分读写锁以提高效率。synchronized和ReenTrantLock的区别synchronized是关键字依赖于JVMReentrantLock是类依赖于API它提供了比synchronized更多更灵活的特性等待可中断、可实现公平锁、可实现选择性通知锁可以绑定多个条件。volatile关键字volatile关键字是用来保证有序性和可见性的。当一个变量被定义成volatile之后它将具备两项特性1保证可见性2禁止指令重排。即执行到volatile变量时其前面的所有语句都执行完后面所有语句都未执行。且前面语句的结果对volatile变量及其后面语句可见。虽然volatile能够保证可见性但它不能保证原子性。volatile变量在各个线程的工作内存中是不存在一致性问题的但是Java里面的运算操作符并非原子操作这导致volatile变量的运算在并发下一样是不安全的。synchronized和volatile的区别1volatile本质是在告诉JVM当前变量在寄存器工作内存中的值是不确定的需要从主存中读取synchronized则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞住。2volatile仅能使用在变量级别synchronized 则可以使用在变量、方法、和类级别的。3volatile仅能实现变量的修改可见性不能保证原子性而synchronized则可以保证变量的修改可见性和原子性。4volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞。5volatile 标记的变量不会被编译器优化synchronized 标记的变量可以被编译器优化。如果不使用synchronized和Lock如何保证线程安全volatilevolatile关键字为域变量的访问提供了一种免锁机制使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新因此每次使用该域就要重新计算而不是使用寄存器中的值。乐观锁和悲观锁悲观锁总是假设最坏的情况每次去拿数据的时候都认为别人会修改所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会阻塞直到它拿到锁共享资源每次只给一个线程使用其它线程阻塞用完后再把资源转让给其它线程。Java中悲观锁是通过synchronized关键字或Lock接口来实现的。乐观锁总是假设最好的情况每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型这样可以提高吞吐量。乐观锁一般会使用版本号机制或者CASCompare And Swap算法实现。同步器AQS抽象队列同步器AbstractQueuedSynchronizerAQS用来构建锁或者其他同步组件减少了各功能组件实现的代码量也解决了在实现同步器时涉及的大量细节问题使用 AQS 能简单且高效地构造出应用广泛的大量的同步器例如ReentrantLock可重入锁支持公平和非公平的方式获取锁Semaphore计数信号量;ReentrantReadWriteLock读写锁。AQS的原理是什么如果被请求的共享资源空闲则将当前请求资源的线程设置为有效的工作线程并且将共享资源设置为锁定状态。如果被请求的共享资源被占用那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制这个机制AQS是用 CLH 队列锁实现的即将暂时获取不到锁的线程加入到队列中。ThreadLocalThreadLocal是线程私有的局部变量存储容器它用来存储线程私有变量内部真正存取是一个Map。每个线程可以通过set()和get()存取变量多线程间无法访问各自的局部变量。只要线程处于活动状态它所对应的ThreadLocal实例就是可访问的线程被终止后它的所有实例将被垃圾收集。ThreadLocal存储的变量属于当前线程。ThreadLocal经典的使用场景是为每个线程分配一个JDBC连接 Connection这样就可以保证每个线程的都在各自的Connection上进行数据库的操作。另外ThreadLocal还经常用于管理Session会话将Session保存在ThreadLocal中使线程处理多次处理会话时始终是同一个Session。线程池系统启动一个新线程的成本是比较高的在这种情形下使用线程池可以很好地提高性能尤其是当程序中需要创建大量生存期很短暂的线程时更应该考虑使用线程池。线程池提供了一种限制和管理资源包括执行一个任务的方式。使用线程池的好处1降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗2提高响应速度当任务到达时任务可以不需要的等到线程创建就能立即执行3提高线程的可管理性线程是稀缺资源如果无限制的创建不仅会消耗系统资源还会降低系统的稳定性使用线程池可以进行统一的分配调优和监控。如何创建线程池1通过ThreadPoolExecutor 的构造方法实现2通过Executor 框架的工具类 Executors 来实现。线程池的工作流程1判断核心线程池是否已满没满则创建一个新的工作线程来执行任务。2判断任务队列是否已满没满则将新提交的任务添加在工作队列。3判断整个线程池是否已满没满则创建一个新的工作线程来执行任务已满则执行饱和拒绝策略。线程池都有哪些状态RUNNING能接受新提交的任务并且也能处理阻塞队列中的任务。SHUTDOWN关闭状态不再接受新提交的任务但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时调用shutdown()方法会使线程池进入到该状态。STOP不能接受新任务也不处理队列中的任务会中断正在处理任务的线程。在线程池处于RUNNING或SHUTDOWN状态时调用shutdownNow()方法会使线程池进入到该状态。TIDYING如果所有的任务都已终止了有效线程数为0线程池进入该状态后会调用terminated()方法进入TERMINATED 状态。TERMINATED在terminated()方法执行完后进入该状态默认terminated()方法中什么也没有做。线程池的拒绝策略当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize如果还有任务到来就会采取任务拒绝策略通常有以下四种策略1AbortPolicy丢弃任务并抛出异常。2DiscardPolicy丢弃任务但是不抛出异常。3DiscardOldestPolicy丢弃队列最前面的任务然后重新尝试执行任务重复该过程。4CallerRunsPolicy由调用线程处理该任务。线程池的队列大小通常怎么设置1CPU密集型任务尽量使用较小的线程池一般为CPU核心数1。2IO密集型任务可以使用稍大的线程池一般为2*CPU核心数。63混合型任务可以将任务分成IO密集型和CPU密集型任务然后分别用不同的线程池去处理。只要分完之后两个任务的执行时间相差不大那么就会比串行执行来的高效。线程池有哪些参数各个参数的作用是什么1corePoolSize核心工作线程数当向线程池提交一个任务时若线程池已创建的线程数小于corePoolSize即便此时存在空闲线程也会通过创建一个新线程来执行该任务直到已创建的线程数大于或等于corePoolSize。2maximumPoolSize最大线程数线程池所允许的最大线程个数。当队列满了且已创建的线程数小于maximumPoolSize则线程池会创建新的线程来执行任务。另外对于无界队列可忽略该参数。3keepAliveTime多余线程存活时间当线程池中线程数大于核心线程数时线程的空闲时间如果超过线程存活时间那么这个线程就会被销毁直到线程池中的线程数小于等于核心线程数。4TimeUnit线程活动保持时间的单位5workQueue队列用于传输和保存等待执行任务的阻塞队列。6threadFactory线程创建工厂用于创建新线程。7handler拒绝策略当线程池和队列都满了再加入线程会执行此策略。
http://www.dnsts.com.cn/news/78599.html

相关文章:

  • 哪有免费的网站建设模板wordpress+淘客代码
  • 萧县建设局网站网站做自适应好不好
  • 网站建设汇编材料高端网站改版顾问
  • 福州网站设计哪里比较好网站首屏做多大
  • 网站开发的技术支撑 经验能力建筑网站可以ai绘画吗
  • 怎么做贷款网站大连做网站谁家售后好
  • 培训机构网站设计好吗微信广告投放收费标准
  • 商丘网站制作设计师图片素材网站
  • 公司网站的主页优化fifa17做任务网站
  • 大学生免费ppt网站著名展示空间设计案例
  • 做周边的专业网站网站建设页面大小
  • 钦州电商网站建设小程序开发费用明细
  • 俄文网站引擎网站解析后怎么做
  • 服务器网站网站专用doaction wordpress
  • 扶余市建设局网站上海人才招聘信息最新招聘信息
  • 找人开发一个网站多少钱泰州专业网站制作公司
  • 销售行业怎样做网站电商网站设计公司优选亿企邦
  • 网站开发都需要什么兰州微信信息平台网站建设
  • 竹子建站免费版html做网站心得
  • 国外网站三维特效教程找工程项目信息哪个app好用
  • 合肥比较好的网站制作成都到西安动车
  • 最流行的做网站语言十堰优化seo
  • 青岛免费网站建设分销平台门店端
  • js网站源码下载企业网站建设协议
  • 河东集团网站建设西柳网站建设
  • 贵阳做网站优化北京外贸行业网站建设
  • 企业网站报告册设计模板网站开发制作公司排行
  • 打开备份的wordpress网络seo外包
  • 前端后端都是网站开发吧可道网站建设
  • 湖南送变电建设公司 网站网站后台管理系统下载