转眼又到了一年中各个软件开发相关企业的招人高峰期啦,在面试过程中多线程问题可是经常被问及的呢,那我们该如何回那些经常被问及的多线程问题呢?
首先呢,我们可以在心里记住下面这张图片:
对应的问题会有:
1.线程的实现方式,线程的生命周期等。
我们可以按照下面这样一点一点说明:
答:1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
(1)生命周期的五种状态
新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
例如:Thread t1=new Thread();
就绪(runnable)线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
运行(running)线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
2.线程中常用方法的区别?
线程中最多用到的是start方法,它的作用是用来启动一个线程。(一个Thread类的对象就是一个线程,用这个对象.start()就是启动一个线程)
其次,线程中用的多的就是sleep,join,wait这种会引发InterruptedException异常的方法,
sleep是用来休眠一个线程一段时间,
join是用来强制执行一个线程,
wait这个方法是Object类中的方法,用于等待。
除yield(),礼让的意思就是让另外一个线程执行一会,然后自己再执行,不同于sleep。
还有获得当前线程的对象,这个方法也很重要,currentThread()。
对于线程中,还应了解到线程的死锁的概念,不需要掌握这个概念,但是应该知道可以通过哪些途径避免死锁,java中提供了使用Synchronized关键字和Synchronized同步方法来解决。
3. 多线程和单线程有什么区别?
答:单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到。
多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群发email的多线程软件,由于操作一次需要网络的返回信息花的时间比较长,而对cpu来说却是空闲的,如果是一个一个顺序执行,那么搜索几千个IP就会花上好久好久。 而如果用多线程就可以在等待期间 加入其他的搜索,然后等待,这样可以提高效率。
4. 用同步块与同步方法的区别?
答:同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差
同步块就是使用synchronized修饰的代码块,可以同步一小部分代码
同步块越小性能越好,当性能要求比较高时,用同步块
5. .说说stop为什么不建议使用。
答:stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。
6. unable接口的方法是什么?
答:run()
什么是同步和异步,分别用例子说明,同步有几种方式?
同步就是排队去做事情,异步就是各做各的
7. 线程的死锁问题
答:死锁就是当有两个或两个以上的线程都获得对方的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。
条件:两个或两个以上的线程
同时想要获取对方的资源,彼此又不肯放开
8. 线程的四种状态,__、_、_、___。启动调用_方法,启动后会调用__方法。
答:四种状态:新(new) 可执行(runnable)堵塞(blocked)死(dead)
启动调用start 启动后调用run
9. 线程的启动是哪个方法,调用的是哪个方法?
答:start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。
run用于子类重写来实现线程的功能。
我们一般调用的是start方法,系统调用的
是run方法。
10. wait,notify,notifyAll在什么地方使用才有效,他们是那个类的方法
答:wait ,notify , notifyAll都必须在synchronized修饰的方法或synchronized块中使用,都属于Object的方法,可以被所有类继承,都是final修饰的方法,不能通过子类覆写去改变他们的行为。
11. 线程间是什么通信的,通过调用几个方法来交互的
答:线程间是通过相互作用,共同完成一个任务当一个线程调用wait方法后便进入等待状态,需要另一线程调用notify()方法对它进行唤醒。notifyAll可以唤醒所有线程,都必须在synchronized方法或synchronized块里使用
12. 讲下同步方法和同步块的区别,以及什么时候用它们
答:同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差
同步块就是使用synchronized修饰的代码块,可以同步一小部分代码
同步块越小性能越好,当性能要求比较高时,用同步块。
13.为什么Thread里面的大部分方法都是final的
答: 不能被重写,线程的很多方法都是由系统调用的,不能通过子类覆写去改变他们的行为。
14. 一般的线程优先级是什么回事,线程优先级高的线程一定会先执行吗?如果不设置优先级的话,那么线程优先级是多少,设置线程优先级用那个函数
答:线程的优先级就是设置哪个线程优先执行,但也不是绝对的,只是让优先级高的线程优先运行的几率高一些。线程默认是NORM_PRIORITY = 5; 设置优先级使用的是setPriority()函数。
15. 实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种,为什么
答案
线程有3种实现方式:
①.通过继承Thread类,优点:可以直接调用start方法启动。缺点:继承一个类后,不能再继承别的类。需要重写run方法。无返回值。
②.实现Runnable接口,优点:可以实现多个接口或继承一个类;缺点:不能直接启动,要通过构造一个Thread把自己传进去。需要重写run方法,无返回值。
③.实现Callable接口,优点:可以抛出异常,有返回值;缺点:只有jkd1.5以后才支持。需要重写call方法。结合FutureTask和Thread类一起使用,最后调用start启动。
一般最常用的是第二种,实现Runnable接口。比较方便,可扩展性高。
…
总的来说经常会被提交的多线程面试问题不会太难,主要靠理解了之后能比较有条理的回答就没什么大问题了。最后希望各位都能找到自己心仪的工作!想了解更多的相关问题记得关注本站消息。