专注分享各类高校资讯、学科知识百科! 标签云 | 网站地图

常见的Java多线程面试问题及解答

2018-09-26 00:00 笔试面试 高校新知

笔试面试


  问题:进程和线程的区别

  解答:一个进程对应一个程序的执行,而一个线程则是进程执行过程中的一个单独的执行序列,一个进程可以包含多个线程。线程有时候也被称为轻量级进程.

  一个Java虚拟机的实例运行在一个单独的进程中,不同的线程共享Java虚拟机进程所属的堆内存。这也是为什么不同的线程可以访问同一个对象。线 程彼此共享堆内存并保有他们自己独自的栈空间。这也是为什么当一个线程调用一个方法时,他的局部变量可以保证线程安全。但堆内存并不是线程安全的,必须通 过显示的声明同步来确保线程安全。

  问题:列举几种不同的创建线程的方法.

  解答:可以通过如下几种方式:

  继承Thread 类

  实现Runnable 接口

  使用Executor framework (这会创建一个线程池)

  123456789101112131415class Counter extends Thread {//method where the thread execution will start public void run(){//logic to execute in a thread }//let’s see how to start the threadspublic static void main(String[] args){Thread t1 = new Counter();Thread t2 = new Counter();t1.start(); //start the first thread. This calls the run() method.t2.start(); //this starts the 2nd thread. This calls the run() method. }}123456789101112131415class Counter extends Base implements Runnable{//method where the thread execution will start public void run(){//logic to execute in a thread }//let us see how to start the threadspublic static void main(String[] args){Thread t1 = new Thread(new Counter());Thread t2 = new Thread(new Counter());t1.start(); //start the first thread. This calls the run() method.t2.start(); //this starts the 2nd thread. This calls the run() method. }}

  通过线程池来创建更有效率。

  问题:推荐通过哪种方式创建线程,为什么?

  解答:最好使用Runnable接口,这样你的类就不必继承Thread类,不然当你需要多重继承的时候,你将 一筹莫展(我们都知道Java中的类只能继承自一个类,但可以同时实现多个接口)。在上面的例子中,因为我们要继承Base类,所以实现Runnable 接口成了显而易见的选择。同时你也要注意到在不同的例子中,线程是如何启动的。按照面向对象的方法论,你应该只在希望改变父类的行为的时候才去继承他。通 过实现Runnable接口来代替继承Thread类可以告诉使用者Counter是Base类型的一个对象,并会作为线程执行。

  问题:简要的说明一下高级线程状态.

  解答:下图说明了线程的各种状态.

  可执行(Runnable):当调用start()方法后,一个线程变为可执行状态,但是并不意味着他会立刻开始真正地执行。而是被放入线程池,

  由线程调度器根据线程优先级决定何时挂起执行。

  12MyThread aThread = new MyThread();aThread.start(); //becomes runnable

  执行中(Running):处理器已经在执行线程的代码。他会一直运行直到被阻断,或者通过静态方法Thread.yield()自行放弃执行的机会,考虑到场景切换所带来的开销,yield()方法不应该被经常调用。

  等待中(Waiting):线程由于等待I/O等外部进程的处理结果而处于被阻断的状态,调用currObject.wait( )方法会使得当前线程进入等待状态,直到其它线程调用currObject.notify() 或者currObject.notifyAll() 。

  睡眠中(Sleeping):重载方法Thread.sleep(milliseconds),Thread.sleep(milliseconds, nanoseconds)可以迫使Java线程进入睡眠状态(挂起)。

  由于I/O阻塞(Blocked on I/O):当I/O条件发生变化时(例如读取了几个字节的数据)会迁移到可执行状态。

  由于同步阻塞中(Blocked on synchronization): 当获取锁之后会进入执行中状态。

  Thread.State 枚举类型包含了Java虚拟机支持的全部的线程状态类型,下面几点Java的线程宗旨确保了这些线程状态成为可能。

  对象可以被任何线程共享和修改。

  线程调度器的抢占性特性,使得线程可以随时在/不在多核处理之间切换处理器内核,这意味着方法可以在执行的过程中切换状态。否则方法中的死循环将永远阻塞CPU,并且使得不同线程的其他方法始终得不到执行。

  为了防止线程安全问题,那些脆弱的方法或者代码块可以被锁定。这使得线程可以处于被锁定或者加锁请求处理中两种状态。

  线程在处理I/O资源(如Sockets,文件句柄,数据库连接等)时会进入等待状态,

  处于I/O读写中的线程不能被切换,因此他们或者以成功/失败的结果正常完成处理,或者其它线程关闭了相应的资源,迫使他进入死亡或者完成的状态。这也是为什么一个合理的超时时间可以避免线程由于I/O处理而被永远阻塞,从而导致严重的性能问题。

  线程可以进入睡眠状态,以使得其他处于等待状态的线程有机会执行。

  问题:yield和sleeping有何区别,sleep()和wait()有何区别?

  解答:当一个任务调用了yield()方法,它将从执行中状态转变为可执行。而当一个任务调用了sleep(),则将从执行中状态转变为等待中/睡眠中状态。

  方法wait(1000)使得当前线程睡眠1秒钟,但调用notify() 或者notifyAll()会随时唤醒线程。而sleep(1000)则会导致当前线程休眠1秒钟。

  问题:为什么为了线程安全而锁定一个方法或者一个代码块称为“同步”而不是“锁定”或者“被锁定”

  解答:当某个方法或者代码块被声明为”synchronized”后,保存数据的内存空间(例如堆内存)将保持被同步状态。

  这意味着:当一个线程获取锁并且执行到已被声明为synchronized的方法或者代码块时,该线程首先从主堆内存空间中读取该锁定对象的所有变 化,以确保其在开始执行之前拥有最新的信息。在synchronized部分执行完毕,线程准备释放锁的时候,所有针对被锁定对象的修改都将为写入主堆内 存中。这样其他线程在请求锁的时候就可以获取最新的信息。

  问题:线程如何进行的同步处理?你可以列举出那些同步级别?同步方法和代码块如何区别?

  解答:在Java语言中,每个对象都有一个锁,一个线程可以通过关键字synchronized来申请获取某个 对象的锁,关键字synchronized可以被用于方法(粗粒度锁,对性能影响较大)或代码块(细粒度锁)级别。锁定方法往往不是一个很好的选择,取而 代之的我们应该只锁定那些访问共享资源的代码块,因为每一个对象都有一个锁,所以可以通过创建虚拟对象来实现代码块级别的同步,方法块级别的锁比锁定整个 方法更有效。

  Java虚拟机灵活的使用锁和监视器,一个监视器总体来说就是一个守卫者,他负责确保只有一个线程会在同一时间执行被同步的代码。每个监视器对应一 个对象的引用,在线程执行代码块的第一条指令之前,他必须持有该引用对象的锁,否则他将无法执行这段代码。一旦他获得锁,该线程就可以进入这段受到保护的 代码。当线程不论以何种方式退出代码块时,他都将释放关联对象的锁。对于静态方法,需要请求类级别的锁。


本文标题常见的Java多线程面试问题及解答,更多相关内容请关注收藏本站,谢谢!

(编辑:高校新知)

推荐阅读

  • 最新面试销售经理的常见问题

    面试销售经理,需要准备哪些问题呢?针对不少求职者应聘销售经理这个职位,但是对于销售经理面试问题不是很熟悉,为此小编为大家提供2018年最新面试...

    2018-09-01 818 笔试面试

  • 客服经理面试常见的问题有哪些

    以下分享的面试问题是应聘客服经理最常见的面试题来的,现在搜集给大家,希望大家以后的面试都能顺利通过。  一、填空:(5分,每空1分)  1、...

    2018-09-20 620 笔试面试

  • 常见的Java多线程面试问题及解答

    问题:进程和线程的区别  解答:一个进程对应一个程序的执行,而一个线程则是进程执行过程中的一个单独的执行序列,一个进程可以包含多个线程。...

    2018-09-26 821 笔试面试

  • 如何回答面试过程中的常见问题

    1、请你自我介绍一下自己好吗?  回答提示:一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有。其实,企业最希望...

    2018-09-21 604 笔试面试

  • ibm公司的面试及笔试经历分享

    一个十分偶然的机会,使我获得了IBM将招人的信息,为此我开始了IBM的面试及笔试经历。  第一、将自己的中英文简历发至IBM人事部,当然,有朋友帮你...

    2018-08-04 672 笔试面试

  • 电话面试常见的问题

    我的第一次工作面试,竟然还是电话远程的,面试人是昂达电子人事部肖主管.第一次回答这样的我很多从未想过的问题,还真有难度嘞.自觉答的不很好,...

    2018-09-23 857 笔试面试

  • HR盘点12个职场面试常见问题

    面试是每个人进入职场的必经之路,但是很多人都在有疑问,面试短短的几分钟,面试官怎么就断定哪个是他想要的人呢?面试时到底都考察的什么?面试...

    2018-08-04 846 笔试面试

  • 外贸学生笔试与面试技巧

    1.笔试的技巧  这里对笔试的一般考题做个总结,供大家做准备。这里提供的题目不一定所有公司都考,只是其中的一个或几个,而且有的公司根本就没...

    2018-09-22 867 笔试面试

  • 中行面试的常见问题

    以下是中行面试最长见的问题,大家可以练习一下,或许对大家以后的面试有帮助。  1.自我介绍  2.对中国银行的印象、了解,对现在银行业的看法 ...

    2018-09-20 615 笔试面试

  • 笔试与面试,到底谁是老大职场

    现代社会,竞争是不可避免的,职场中也如此。但是,竞争必须确定一个基本的参评项目与评判标准,即确定谁胜谁败,总得有个统一的尺度。在公务员考...

    2018-07-28 787 笔试面试

  • 常见的面试问题精选

    1、自我介绍  掌握你的发言时间。1—2分钟较为适宜。以个人简历为引子,扩展丰富公司对你的了解,但不可离题万里,切中要害是大原则。  2、你最...

    2018-09-22 867 笔试面试

  • 会计人员面试的常见问题汇总

    1,的6大基本要素是什么?  2,会计的3大报表是什么?  3,权益性支出与资本性支出的差异是什么?  3,固定资产折旧采用的方法有哪些?  ...

    2018-09-23 884 笔试面试