点击上方[全栈开发者社区]右上角[...][设为星标⭐]

面试题一:跳槽涨薪季面试题之java基础(一)

面试题二:跳槽涨薪季面试题之java8特性(二)--文末送书

1.什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。

2.线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。

3.如何在Java中实现线程?

由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。

4.用Runnable还是Thread?

如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。

5.Thread 类中的start() 和 run() 方法有什么区别?

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

6.Java中Runnable和Callable有什么不同?

Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。

7.Java中CyclicBarrier 和 CountDownLatch有什么不同?

CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。

CyclicBarrier  : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。

这样应该就清楚一点了,对于CountDownLatch来说,重点是那个“一个线程”,是它在等待,而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。而对于CyclicBarrier来说重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。

8.Java内存模型是什么?

Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:

线程内的代码能够按先后顺序执行,这被称为程序次序规则。

对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。

前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。

一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。

一个线程的所有操作都会在线程终止之前,线程终止规则。

一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。

可传递性

9.什么是线程安全?Vector是一个线程安全类吗? 

多个线程可能会同时运行同一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。

10.Java中如何停止一个线程?

当run() 或者 call() 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile 布尔变量或设置某个变量达到一定值的时候,来退出run()方法的循环或者是取消任务来中断线程。

11.一个线程运行时发生异常会怎样?

简单的说,如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

12.为什么wait, notify 和 notifyAll这些方法不在thread类里面?

一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

13.什么是线程池?为什么要使用它?

创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)

14.Java多线程中的死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法完成任务,死锁的发生必须满足以下四个条件:

互斥条件:一个资源每次只能被一个进程使用。

请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

15.什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?

线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

16.为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用?

当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

17.什么是线程池?如何创建一个Java线程池?

一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。

java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池。线程池例子展现了如何创建和使用线程池,或者阅读ScheduledThreadPoolExecutor例子,了解如何创建一个周期任务。

18.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。

阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。

BlockingQueue 接口是java collections框架的一部分,它主要用于实现生产者-消费者问题。

19.线程的生命周期?

线程一共有五个状态,分别如下:

新建(new):当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

运行(running):线程获得 CPU 资源正在执行任务(#run() 方法),

死亡(dead):当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

堵塞(blocked):由于某种原因导致正在运行的线程让出 CPU 并暂停自己的执行,即进入堵塞状态。直到线程进入可运行(runnable)状态,才有机会再次获得 CPU 资源,转到运行(running)状态。阻塞的情况有三种:

调用 notify() 方法,回到就绪状态。

20.创建线程有几种方式

方式一,继承 Thread 类创建线程类。

方式二,通过 Runnable 接口创建线程类。

方式三,通过 Callable 和 Future 创建线程。

觉得本文对你有帮助?请分享给更多人

关注「全栈开发者社区」加星标,提升全栈技能

本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!

如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。

好文章,我在看❤️

线程池每次用都创建吗_跳槽涨薪季面试题之多线程(三)相关推荐

  1. java 多态判断非空_跳槽涨薪季面试题之java基础(一)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 为迎接金九银十跳槽涨薪季,小编汇总了java精编版面试题,大概从java基础.java8特性.多线程.spring.springboot. ...

  2. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  3. scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了

    scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了 原因 If any execution of the task encounters an ...

  4. 线程池概念、线程池作用、线程池的四种创建方式

    线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...

  5. springboot微服务实战:初探异步线程池(四种创建多线程对比)

    四种多线程对比(异步) 创建和初始化多线程的几种方式1.继承Thread2.实现Runnable接口3.实现Callable接口 + FutureTask(可以拿到返回结果,可以处理异常)4.线程池 ...

  6. 线程池有几种创建方式?

    总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolExecutor 手动创建线程池 通过 Executors 执行器自动创建线程池. 而以上两类创建线程池的方式,又有 7 种具体实现方 ...

  7. 面试突击:线程池有几种创建方式?推荐使用哪种?

    在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 通过 ThreadPoolE ...

  8. 线程池 java 新建方式_Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFi ...

  9. 线程池的几种创建方法

    //创建固定长度的线程池// ExecutorService pool1 = Executors.newFixedThreadPool(3);//// for(int i = 1;i <= 4; ...

最新文章

  1. 【软件工程】5.8 黑盒白盒测试
  2. c#异常处理_C#异常处理能力问题和解答 套装2
  3. 2019北妈和你:活着就意味必须要做点什么,请好好努力
  4. Linux服务器--CentOS7上实现LAMP(PhpMyAdmin,WordPress,Discuz)
  5. 机器学习实战15-自动编码器
  6. @echo off是什么意思_高街、BF、FOG、OS风。。。都是些什么鬼?
  7. android handler的机制和原理_Android 插件化原理——Hook机制之AMSamp;PMS解析
  8. 结构型模式:Decorator 装饰模式
  9. linux嵌入式如何学习,嵌入式Linux要如何学习?嵌入式linux学习路线讲解
  10. 推荐一些不错的公众号【二】
  11. 极域电子教室软件 v4.0 2015 豪华版忘记密码怎么办
  12. gif动图怎么制作?分享三个好用的方法
  13. 琵琶行 (白居易诗作)
  14. cURL – POST请求示例
  15. 商丘学院计算机基础,商丘学院
  16. 工作日志之误用篇 工作日志之目的
  17. 浏览器放大缩小,页面布局不变,浏览器放大百分比,页面放大到左上角,浏览器缩小百分比,页面缩小至中间(类似csdn官网效果)
  18. 快速构建企业级应用的开发平台
  19. 查找字幕资源的网址。射手网
  20. 非法字符: '\ufeff' 解决方案(Android Studio)

热门文章

  1. Java 14 Hotspot 虚拟机垃圾回收调优指南!
  2. Spring Boot Profile使用详解及配置源码解析
  3. dnslog在mysql在linux_DNSlog实现Mysql注入
  4. 计算机考试字字处理重点,计算机等级考试一级B上机试题:字表处理题(1)
  5. hadoop 单机单间_零基础入门hadoop大数据四——Hadoop框架前奏,JDK环境配置
  6. ValueError: Program neato not found in path.
  7. torch分布式训练学习笔记
  8. cudnn.benchmark
  9. c++调用python3
  10. 对光照、阴影和反光具有鲁棒性的变化检测算法及实现