25Java多线程和并发面试题(附答案)7~10题.docx





《25Java多线程和并发面试题(附答案)7~10题.docx》由会员分享,可在线阅读,更多相关《25Java多线程和并发面试题(附答案)7~10题.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java多线程和并发面试题(附答案)7To题7、多线程面试题.多线程的创立方式(1)继承Thread类:但Thread本质上也是实现了 Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法 就是通过Thread类的start。实例方法。start。方法是T native方法,它将启动f 新线程,并执行run。方法。这种方式实现多线程 很简单,通过自己的类亘接extend Thread ,并复写run()方法,就可以启动新线程并执行自己定义的run。方法.例如:继承Thread 类实现多线程,并在合适的地方启动线程.MyThreadThread门巾()rintln (
2、MyThread. run();rintln ( MyThread. run();MyThread myThreadl = MyThread。;1 MyThread myThread2 - n. w myThreadO; 1myThreadl.start ();myThreadz . start(2 )实现Runnable接口的方式实现多线程,并且实例化Thread,传入自己的Thread实例,调用run。方法.MyThread - Runnablo frun ()匕inuln ( MyThruiid. run();Thread thread = ThreadmyThread)(3 )使用Ex
3、ecutorService. Callable. Future实现有返回结果的多线程:ExecutorServices Callable. Future这个对象实际上都是 属于Executor框架中的功能类.返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回 值而大费周折了,而且即便实现了也可能漏洞百出.可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须实现Runnable 接口。执行Callable任务后,可以获取f Future的对象,在该对象上网用get就可以获取到Callable任务返回的Object 了,再结 合线程池接
4、口 ExecutorService就可以实现有返回结果的多线程了.下面提供了一个完整的有返回结果的多线程测试例子,在JDKL5下 蛤证过没问题可以直接使用。代码如下:java.util.concurrent.*; iava.util.Date; java.util.List; nava.util.ArrayList;Testmain(St!*ing args)ExecutionException. InterruptedExceptionrintln (程序开始正仃-Dace date】- Daie();创立ExecutorServicenewFixedThraadPool(laskSiza)
5、;多个n返卜” (ft的任List list - ArrayList();i 1 0; i ” f .get:(), toStiring ()Date date2 = 、 Dat:e();System, out.printin (程序结束运行.程序运行时间+ (date2 .getTime () - datel .getTime () +MyCaliableCallableObjccl (String taskNum;Ie(String taskNum)( .taskNum - taskNum.System, out .pnintln ( + tdskNum + fE务系;动”);Dace d
6、ateTmpl -,DateThread, sleep。);Date dateTmp2 - Date ();time - dateTmp2.getTime() - dateTmpl.getTime();System, out-print In (Z 4 taskNum + 任务终止taskNum + ”任务返付|运行结果,当前任务时间【寸time4花秒】;1 .在java中wait和sleep方法的不同?展大的不同是在等待时wait会释放锁,而sleep 一直持有锁.wait通常被用于稣间交互,sleep通常被用于音停执行。2 .synchronized 和 volatile 关键字的作用?一
7、旦一个共享变缴(类的成员变龈、类的除态成员变1ft )被volatile修饰之后,田及就具新了两层语义:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。禁止进行指令重排序. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从生存中读取;synchronized那么是锁定当前变量, 只有当前线程可以访问该变0.其他线程被咀塞住. volatile仅能使用在变显级别;synchronized那么可以使用在变既方法、和类级别的。 vRatile仅罐实现变量的修改可见性,并不能保证原子性;synchroni
8、zed那么可以保证变量的修改可见性和原子性. volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化.4 .分析线程并发访问代码解释原因?in Lbcic k 1 racecount+”count + count +VolatileTestmdin(Sirin& args)Counter counter - Counter ();Thiead Runnable。 (run() (counter inc();.start 0;Systemoutprintin(courttor
9、);上面的代码执行完后输出的结果确定为1000吗?答案是不一定,或者不等于1000.你知道这是为什么吗?在java的内存模型中每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变敏值信息.当线程访问某一个对象时候值的时候, 首先通过对象的引用找到对应在堆内存的变蜃的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程 就不再和对象在堆内存变量值有任何关系,而是直接修改副本变飙的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变 量副本的值回写到对彖在堆中变量.这样在堆中的对象的值就产生变化了。也就是说上面主函数中开启了 1000个子线程,每个线程都有一
10、个变量副本,每个线程修改变量只是I硒修改了自己的副本,当线程结 束时再将修改的值写入在主内存中,这样就出现了线程安全问题.因此结果就不可能等于1000 7 , 一般都会小于1000.上面的解博用一张图表示如下:线程工作内存副本值同步到主内存.什么是线程池,如何使用? 线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用new线程而是直接去池中拿线程即可,节省了开辟子线程的时间, 提高的代码执行效率.在JDK的中提供了生成多种线程池的铮态方法.ExecutorxecutorService newFixedThreadPoolxecutorService newFixedThreadPo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 25 Java 多线程 并发 试题 答案 10

限制150内