多线程的面试题解答(一)

今天看到这篇文章

http://ifeve.com/javaconcurrency-interview-questions-base/


尝试解答一下里面的问题,陆续更新。


1

Java中有几种方法可以实现一个线程

1.实现runnable
2.实现callable
3.继承thread

1、继承Thread类实现多线程
2、实现Runnable接口方式实现多线程
3、使用ExecutorService、Callable、Future实现有返回结果的多线程

ExecutorService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

2
1. stop,不推荐使用
2. interrupt但是不能停止一个循环
3. 抛出中断异常,最好抛出一个RuntimeException

3
sleep和wait的区别

第一种解释:功能差不多,都是让线程休眠,但是sleep()不释放同步锁,wait()释放同步锁。
第二种解释:sleep是Thread类的静态方法。sleep的作用是让线程休眠指定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。
wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify/notifyAll方法才会重新激活调用者。
第三种解释:sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定。
wait()由某个确定的对象来调用。

4
notify和notifyAll的区别
wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码。 
notify()方法表示,当前的线程已经放弃对资源的占有, 
通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, 
然后继续运行wait()后面的语句; 
notifyAll()方法表示,当前的线程已经放弃对资源的占有, 
通知所有的等待线程从wait()方法后的语句开始运行。 

5
什么是Daemon线程?它有什么意义

守护线程,意义,非守护线程停止时,不必关闭守护线程,GC线程就是一个守护线程



6
多线程之间的通讯和协作
1.内存共享
   通过实现Runnable接口实现线程的共享变量
   可以通过内部类的形式来共享变量
2.管道链接
   PipedOutputStream
   PipedInputStream
3.wait和notify/notifyAll
4.await和signal/signalAll
5.sleep/yield/join
6.cyclicbarrier
7.countdownlatch
8.semaphore

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章