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

任丘网站建设公司wordpress下载服务器文件夹

任丘网站建设公司,wordpress下载服务器文件夹,山东企业网站建设费用,设计工具前言多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程#xff0c;进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。软件多线程进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。软件多线程即便处理器只能运行一个线程操作系统也可以通过快速的在不同线程之间进行切换由于时间间隔很小来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。多线程有什么优势1)发挥多核CPU 的优势随着工业的进步现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的4 核、8 核甚至 16 核的也都不少见如果是单线程的程序那么在双核 CPU 上就浪费了 50% 在 4 核 CPU 上就浪费了 75%。单核 CPU 上所谓的多线程那是假的多线程同一时间处理器只会处理一段逻辑只不过线程之间切换得比较快看着像多个线程同时运行罢了。多核 CPU 上的多线程才是真正的多线程它能让你的多段逻辑同时工作多线程可以真正发挥出多核CPU 的优势来达到充分利用CPU 的目的。2)防止阻塞从程序运行效率的角度来看单核 CPU 不但不会发挥出多线程的优势反而会因为在单核CPU 上运行多线程导致线程上下文的切换而降低程序整体的效率。但是单核 CPU 我们还是要应用多线程就是为了防止阻塞。试想如果单核 CPU 使用单线程那么只要这个线程阻塞了比方说远程读取某个数据吧对端迟迟未返回又没有设置超时时间那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题多条线程同时运行哪怕一条线程的代码执行读取数据阻塞也不会影响其它任务的执行。3)便于建模这是另外一个没有这么明显的优点了。假设有一个大的任务 A单线程编程那么就要考虑很多建立整个程序模型比较麻烦。但是如果把这个大的任务 A 分解成几个小任务任务B、任务 C、任务 D分别建立程序模型并通过多线程分别运行这几个任务那就简单很多了。多线程59道面试题1.线程和进程的区别是什么进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间一个进程崩溃后在保护模式下不会对其它进程产生影响而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量但线程之间没有单独的地址空间一个线程死掉就等于整个进程死掉所以多进程的程序要比多线程的程序健壮但在进程切换时耗费资源较大效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作只能用线程不能用进程。2.Java 实现线程有哪几种方式1)继承 Thread 类实现多线程2)实现 Runnable 接口方式实现多线程3)使用 ExecutorService、Callable、Future 实现有返回结果的多线程3.启动线程方法 start()和 run()有什么区别只有调用了 start()方法才会表现出多线程的特性不同线程的 run()方法里面的代码交替执行。如果只是调用 run()方法那么代码还是同步执行的必须等待一个线程的 run()方法里面的代码全部执行完毕之后另外一个线程才可以执行其 run()方法里面的代码。4.怎么终止一个线程如何优雅地终止线程stop 终止不推荐。5.一个线程的生命周期有哪几种状态它们之间如何流转的NEW毫无疑问表示的是刚创建的线程还没有开始启动。RUNNABLE: 表示线程已经触发 start()方式调用线程正式启动线程处于运行中状态。BLOCKED表示线程阻塞等待获取锁如碰到 synchronized、lock 等关键字等占用临界区的情况一旦获取到锁就进行 RUNNABLE 状态继续运行。WAITING表示线程处于无限制等待状态等待一个特殊的事件来重新唤醒如通过wait()方法进行等待的线程等待一个 notify()或者 notifyAll()方法通过 join()方法进行等待的线程等待目标线程运行结束而唤醒一旦通过相关事件唤醒线程线程就进入了 RUNNABLE 状态继续运行。TIMED_WAITING表示线程进入了一个有时限的等待如 sleep(3000)等待 3 秒后线程重新进行 RUNNABLE 状态继续运行。TERMINATED表示线程执行完毕后进行终止状态。需要注意的是一旦线程通过 start 方法启动后就再也不能回到初始 NEW 状态线程终止后也不能再回到RUNNABLE 状态.7.线程中的 wait()和 sleep()方法有什么区别这个问题常问sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间不同点在于如果线程持有某个对象的监视器sleep 方法不会放弃这个对象的监视器wait方法会放弃这个对象的监视器8.多线程同步有哪几种方法Synchronized 关键字Lock 锁实现分布式锁等。9.什么是死锁如何避免死锁死锁就是两个线程相互等待对方释放对象锁。10.多线程之间如何进行通信wait/notify11、线程怎样拿到返回结果实现Callable 接口。12、violatile 关键字的作用一个非常重要的问题是每个学习、应用多线程的 Java 程序员都必须掌握的。理解 volatile关键字的作用的前提是要理解 Java 内存模型这里就不讲 Java 内存模型了可以参见第31 点volatile 关键字的作用主要有两个1)多线程主要围绕可见性和原子性两个特性而展开使用 volatile 关键字修饰的变量保证了其在多线程之间的可见性即每次读取到 volatile 变量一定是最新的数据2)代码底层执行不像我们看到的高级语言----Java 程序这么简单它的执行是 Java代码--字节码--根据字节码执行对应的 C/C代码--C/C代码被编译成汇编语言--和硬件电路交互现实中为了获取更好的性能 JVM 可能会对指令进行重排序多线程下可能会出现一些意想不到的问题。使用 volatile 则会对禁止语义重排序当然这也一定程度上降低了代码执行效率从实践角度而言volatile 的一个重要 作 用 就 是 和 CAS 结 合 保 证 了 原 子 性 详 细 的 可 以 参 见java.util.concurrent.atomic 包下的类比如 AtomicInteger。13、新建 T1、T2、T3 三个线程如何保证它们按顺序执行用 join 方法。14、怎么控制同一时间只有 3 个线程运行用 Semaphore。15、为什么要使用线程池我们知道不用线程池的话每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行一个线程线程少的话这不会是问题而真实环境可能会开启多个线程让系统和程序达到最佳效率当线程数达到一定数量就会耗尽系统的 CPU 和内存资源也会造成 GC频繁收集和停顿因为每次创建和销毁一个线程都是要消耗系统资源的如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。所以线程池中的线程复用极大节省了系统资源当线程一段时间不再有任务处理时它也会自动销毁而不会长驻内存。16、常用的几种线程池并讲讲其中的工作原理。什么是线程池很简单简单看名字就知道是装有线程的池子我们可以把要执行的多线程交给线程池来处理和连接池的概念一样通过维护一定数量的线程池来达到多个线程的复用。线程池的好处我们知道不用线程池的话每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行一个线程线程少的话这不会是问题而真实环境可能会开启多个线程让系统和程序达到最佳效率当线程数达到一定数量就会耗尽系统的 CPU 和内存资源也会造成 GC频繁收集和停顿因为每次创建和销毁一个线程都是要消耗系统资源的如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。所以线程池中的线程复用极大节省了系统资源当线程一段时间不再有任务处理时它也会自动销毁而不会长驻内存。线程池核心类在 java.util.concurrent 包中我们能找到线程池的定义其中 ThreadPoolExecutor 是我们线程池核心类首先看看线程池类的主要参数有哪些。如何提交线程如 可 以 先 随 便 定 义 一 个 固 定 大 小 的 线 程 池 ExecutorService es Executors.newFixedThreadPool(3);提交一个线程es.submit(xxRunnble);es.execute(xxRunnble);submit 和 execute 分别有什么区别呢execute 没有返回值如果不需要知道线程的结果就使用 execute 方法性能会好很多。submit 返回一个 Future 对象如果想知道线程结果就使用 submit 提交而且它能在主线程中通过 Future 的 get 方法捕获线程中的异常。如何关闭线程池es.shutdown();不再接受新的任务之前提交的任务等执行结束再关闭线程池。es.shutdownNow();不再接受新的任务试图停止池中的任务再关闭线程池返回所有未处理的线程list 列表。17、线程池启动线程 submit()和 execute()方法有什么不同execute 没有返回值如果不需要知道线程的结果就使用 execute 方法性能会好很多。submit 返回一个 Future 对象如果想知道线程结果就使用 submit 提交而且它能在主线程中通过 Future 的 get 方法捕获线程中的异常。18、CyclicBarrier 和 CountDownLatch 的区别两个看上去有点像的类都在 java.util.concurrent 下都可以用来表示代码运行到某个点上二者的区别在于1.CyclicBarrier 的某个线程运行到某个点上之后该线程即停止运行直到所有的线程都到达了这个点所有线程才重新运行CountDownLatch 则不是某线程运行到某个点上之后只是给某个数值-1 而已该线程继续运行。2.CyclicBarrier 只能唤起一个任务CountDownLatch 可以唤起多个任务3.CyclicBarrier 可 重 用 CountDownLatch 不 可 重 用 计 数 值 为 0 该CountDownLatch就不可再用了。19、什么是活锁、饥饿、无锁、死锁死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题如果线程出现了这三种情况即线程不再活跃不能再正常地执行下去了。死锁死锁是多线程中最差的一种情况多个线程相互占用对方的资源的锁而又相互等对方释放锁此时若无外力干预这些线程则一直处理阻塞的假死状态形成死锁。举个例子A 同学抢了 B 同学的钢笔B 同学抢了 A 同学的书两个人都相互占用对方的东西都在让对方先还给自己自己再还这样一直争执下去等待对方还而又得不到解决老师知道此事后就让他们相互还给对方这样在外力的干预下他们才解决当然这只是个例子没有老师他们也能很好解决计算机不像人如果发现这种情况没有外力干预还是会一直阻塞下去的。活锁活锁这个概念大家应该很少有人听说或理解它的概念而在多线程中这确实存在。活锁恰恰与死锁相反死锁是大家都拿不到资源都占用着对方的资源而活锁是拿到资源却又相互释放不执行。当多线程中出现了相互谦让都主动将资源释放给别的线程使用这样这个资源在多个线程之间跳动而又得不到执行这就是活锁。饥饿我们知道多线程执行中有线程优先级这个东西优先级高的线程能够插队并优先执行这样如果优先级高的线程一直抢占优先级低线程的资源导致低优先级线程无法得到执行这就是饥饿。当然还有一种饥饿的情况一个线程一直占着一个资源不放而导致其他线程得不到执行与死锁不同的是饥饿在以后一段时间内还是能够得到执行的如那个占用资源的线程结束了并释放了资源。无锁无锁即没有对资源进行锁定即所有的线程都能访问并修改同一个资源但同时只有一个线程能修改成功。无锁典型的特点就是一个修改操作在一个循环内进行线程会不断的尝试修改共享资源如果没有冲突就修改成功并退出否则就会继续下一次循环尝试。所以如果有多个线程修改同一个值必定会有一个线程能修改成功而其他修改失败的线程会不断重试直到修改成功。之前的文章我介绍过 JDK 的CAS 原理及应用即是无锁的实现。可以看出无锁是一种非常良好的设计它不会出现线程出现的跳跃性问题锁使用不当肯定会出现系统性能问题虽然无锁无法全面代替有锁但无锁在某些场合下是非常高效的。20、什么是原子性、可见性、有序性原子性、可见性、有序性是多线程编程中最重要的几个知识点由于多线程情况复杂如何让每个线程能看到正确的结果这是非常重要的。原子性原子性是指一个线程的操作是不能被其他线程打断同一时间只有一个线程对一个变量进行操作。在多线程情况下每个线程的执行结果不受其他线程的干扰比如说多个线程同时对同一个共享成员变量 n100 次如果 n 初始值为 0n 最后的值应该是 100所以说它们是互不干扰的这就是传说的中的原子性。但 n并不是原子性的操作要使用 AtomicInteger 保证原子性。可见性可见性是指某个线程修改了某一个共享变量的值而其他线程是否可以看见该共享变量修改后的值。在单线程中肯定不会有这种问题单线程读到的肯定都是最新的值而在多线程编程中就不一定了。每个线程都有自己的工作内存线程先把共享变量的值从主内存读到工作内存形成一个副本当计算完后再把副本的值刷回主内存从读取到最后刷回主内存这是一个过程当还没刷回主内存的时候这时候对其他线程是不可见的所以其他线程从主内存读到的值是修改之前的旧值。像CPU 的缓存优化、硬件优化、指令重排及对 JVM 编译器的优化都会出现可见性的问题。有序性我们都知道程序是按代码顺序执行的对于单线程来说确实是如此但在多线程情况下就不是如此了。为了优化程序执行和提高 CPU 的处理性能JVM 和操作系统都会对指令进行重排也就说前面的代码并不一定都会在后面的代码前面行即后面的代码可能会插到前面的代码之前执行只要不影响当前线程的执行结果。所以指令重排只会保证当前线程执行结果一致但指令重排后势必会影响多线程的执行结果。虽然重排序优化了性能但也是会遵守一些规则的并不能随便乱排序只是重排序会影响多线程执行的结果。由于文章篇幅限制小编在这里只介绍了20道多线程的面试题剩下的39道就不做过多的介绍啦如果大家需要这份多线程面试题的话可以转发此文关注小编私信小编“学习”来得到获取方式吧~~
http://www.zqtcl.cn/news/598352/

相关文章:

  • 哪家网络公司做网站工信部网站原来是
  • json取数据做网站asp网站 模板
  • 漳州做网站多少钱乐清网红餐厅
  • 淮安网站开发sem推广案例
  • 义乌网站建设郭云砺信息科技做网站
  • 重庆御临建筑公司官网网站更换域名seo
  • 北京大兴专业网站建设公司wordpress 加速乐
  • win7怎么做网站域名绑定邯郸最新通知今天
  • 苏州企业网站设计开发个人 网站备案
  • 威海哪有网站建设中国建设部网站失信名单
  • 重庆哪家在做网站建设php网站后台验证码不显示
  • 开发网站开票写什么google收录查询
  • dw做的网站如何上传图片服务器配置wordpress
  • 恩施网站优化七牛云可以做网站的存储空间吗
  • 网站建设的源代码有什么作用网站维护包括哪些
  • 广东广东网站建设工作网站qq登录 开发
  • 中山网页网站设计模板access 数据库做网站
  • 阿里云网站做网站的服务器用什么系统
  • 什么公司做网站最好怎么给网站做快照
  • 官方网站建设的方法有哪些方面邮箱号码大全
  • 电商app软件山东网络推广优化排名
  • 国内产品网站w源码1688网站关键词描述字数
  • 网站404 模板wordpress 文字插件下载
  • 河南民基建设工程有限公司网站齐齐哈尔建设局网站首页
  • 响应式网站建设推荐乐云践新三丰云免费云服务器
  • 长沙网站建设模板uc浏览器访问网站
  • 擼擼擼做最好的导航网站陕西政务服务网注册公司流程
  • 怎样做商城网站的推广wordpress用php哪个版本好
  • 网站功能模块建设建设网站考证
  • 网站代码结构成都住建局官网报名入口