zoukankan      html  css  js  c++  java
  • Java 多线程

    线程对于开发人员来说并不陌生,这是进行应用程序开发的基础之一。首先我们来回顾一下线程的基本概念,线程的状态。

    在java中,线程是指进程中的一组执行流程,通常有两种实现方法,一种是继承Thread类,另一种是实现Runnable接口。

    线程的状态主要有5种,NEW,RUNNABLE,RUNNING,BLOCKED,DEAD,这5种状态是可以相互转换的。

    从图上可以清楚的看到他们之间的转换。这里就不在赘述了。下面直接看题

    一、基础篇

    1.进程与线程的区别?

    答:进程可看成是一个自包含的运行环境,它可以被看成一个应用。而线程可看作是其中的一个执行单元。线程可以称为轻量级进程。线程需要更少的资源来创建和存在于进程中,线程共享进程资源。

    2.使用多线程编程的好处有哪些好处?

    答:使用多线程可以提高程序性能,提高cpu时间的利用率。

    3.用户进程与守护进程的区别?

    答:在java程序中创建的进程称为用户进程,守护进程是运行在后台的。

    4.如何创建一个java进程?

    答:有两种方式,一种是实现Runnable接口,另一种是继承Thread类

    5.进程的生命周期有哪些状态?

    答:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、结束(DEAD)

    6.能调用线程的run方法吗?

    答:可以,但只能被当作普通的方法调用,要真正执行线程方法,只能通过Thread.start()来调用

    7.如何暂停一个正在执行的线程?

    答:可以通过调用线程的sleep方法暂停一段时间,一旦线程唤醒就变成了runnable状态,接着就会根据线程的调度来执行。

    8.谈一下你对线程优先级的理解?

    答:每个线程都有优先级,我们可以为每个线程指定优化级,但不能保证高优化级的线程一定会被先执行。线程的优化程分为1到10这10级,1最低,10最高。

    9.线程调度器和时间切片是什么?

    答:线程调度程序是将CPU时间分配给可用可运行线程的操作系统服务。一旦我们创建并启动了一个线程,它的执行就取决于线程调度程序的实现。时间分片是将可用CPU时间划分到可用可运行线程的过程。将CPU时间分配给线程可以基于线程优先级,或者等待更长时间的线程在获取CPU时间时将获得更多优先级。线程调度不能由Java来控制,所以从应用程序本身控制线程总是更好的。

    10.多线程中上下文切换是什么?

    答:上下文切换就是恢复存储和cpu状态的过程。

    11.在java程序中我们如何确保main()是最后完成的线程?

    答:我们可以使用Thread join()方法来确保程序创建的所有线程在完成主函数之前都已结束

    12.线程之间如何交互?

    答:对象类wait()、notify()和notifyAll()方法允许线程就资源的锁状态进行通信。

    13.为什么线程通信方法wait()、notify()和notifyAll()在Object中?

    答:在Java中,每个对象都有一个monitor和wait, notify方法用于等待对象monitor或通知其他线程对象monitor现在是空闲的。java中没有线程监视器,同步可以与任何对象一起使用,这就是为什么它是对象类的一部分,所以java中的每个类都有这些线程间通信的基本方法。

    14.为什么必须从synchronized方法或块中调用wait()、notify()和notifyAll()方法?

    答:当一个线程调用任何对象上的wait()方法时,它必须持有该对象上的一个监视器,离开时会调用notify(),它将监视器留在对象上,其他等待线程可以获得对象监视器。这些方法需要线程具有对象监视器,这只能通过同步来实现,所以需要从synchronized方法或块来调用。

    15.为什么线程的sleep()和yield()方法是静态的

    答:线程的sleep()和yield()方法只能在当前执行线程上工作。其他状态的线程调用是没有意义的,同时也为 了避免程序员的混淆,它们可能认为其他状态的线程也可以调用这些方法。

    16.java中如何保证线程安全?

    答:有这么几种方式可以实现线程安全:1.synchronized,2.原子并发类,3.实现并发锁接口4.使用volatile关键字,5.使用不可变类6.使用线程安全类

    17.volatile关键字在java的作用是什么?

    答:使用volatile关键字时,所有线程直接从内存中读取,而不是从线程缓存中

    18.Synchronized的方法和Synchronized的代码块哪个更好?

    答:synchronized代码块更好,它在执行时不会锁对象。

    19.在java中如何创建守护线程?

    答:在启动线程类之前调用setDaemon(true)。

    20.ThreadLocal是什么?

    答:ThreadLocal用于创建线程Local变量,对于同一个static ThreadLocal,不同的线程只能从中get,set,remove自己的变量,而不会影响其他的线程。

    21.什么是线程组?为什么不建议使用它?

    答:ThreadGroup是一个类,提供线程组有关的信息,api比较弱,对线程没有提供任何功能,现在已经标记为过时,所以不在建议使用。

    22.什么是线程堆?如何获取一个程序的线程堆?

    答:线程dump是JVM中所有活动线程的列表,线程dump对于分析应用程序中的瓶颈和分析死锁的情况非常有帮助。用jstack可以获取这个列表。

    23.什么是死锁?如何分析和避免它?

    答:至少两个以上的线程互相持有对方的资源(锁),导致线程阻塞,这种现象叫死锁。可以通过线程dump来分析死锁问题,在程序不使用嵌套锁,只锁定需要的和避免无限期等待是避免死锁情况的常用方法

    24.什么是java的定时类?如何让他间隔定时执行?

    答:java.util.Timer可以用于某个时间调度线程执行。可以实现JavaUTI.TimeTebug接口

    25.什么是线程池?在java中如何使用?

    答:线程池是用于管理线程的,它有一个队列,用于保存等待执行的任务。

    java.util.concurrent.Executors可用于创建线程池,有4种类型的线程池。

    newCachedThreadPool,newSingleThreadPool,newScheduledThreadPool,newFixedThreadPool.

    线程池的关键参数:corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue

    26.如果不能override线程类的run方法,会发生什么?

    答:如果不能override线程的run方法,将不能实现我们自己的任何功能。

    二、高级篇

    27.什么是原子操作?

    28.Executors框架是什么?

    29.BlockingQueue是什么?在ThreadPool中如何使用?

    30.Callable,Future,FutureTask分别如何使用?

    31.Concurrency Api在java 8中有哪些新特性?

    32.Lock接口与Syncronized的比较?

  • 相关阅读:
    Android权限大全(链接地址整理)
    Android6.0运行时权限(基于RxPermission开源库)
    Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题
    使用AccessibilityService模拟点击事件失败的分析
    Android混淆打包配置总结
    okhttputils开源库的混淆配置(Eclipse)
    Android布局中的空格以及占一个汉字宽度的空格,实现不同汉字字数对齐
    java开发者大会:总结
    JAVA开发者大会:拍拍贷MQ系统原理与应用
    消息总线真的能保证幂等?
  • 原文地址:https://www.cnblogs.com/ldcs/p/11748920.html
Copyright © 2011-2022 走看看