欢迎来到天天文库
浏览记录
ID:38363910
大小:65.50 KB
页数:11页
时间:2019-06-11
《java面试线程问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java程序员面试中的多线程问题2012-05-2809:12
2、10733次阅读
3、【已有25条评论】发表评论来源:fromdev
4、收藏到我的网摘很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(CollectionsFramework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了Java线程方面一些典型的问题,这些问题经常被高级工程师所问到。0.Java中多线程同步是什么?在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同
5、一个变量,这样容易导致程序出现错误的结果。1.解释实现多线程的几种方法?一Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。2.Thread.start()与Thread.run()有什么区别?Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。3.为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗?我们需要run()&start()这两个方法是因为JVM创建一个单
6、独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的Java的多继承问题。4.什么是ThreadLocal类,怎么使用它?ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。下面是线程局部变量(ThreadLocal
7、variables)的关键点:一个线程局部变量(ThreadLocalvariables)为每个线程方便地提供了一个单独的变量。ThreadLocal实例通常作为静态的私有的(privatestatic)字段出现在一个类中,这个类用来关联一个线程。当多个线程访问ThreadLocal实例时,每个线程维护ThreadLocal提供的独立的变量副本。常用的使用可在DAO模式中见到,当DAO类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)ThreadLocal难于理解,下面这些引用连接有助于你
8、更好的理解它。《GoodarticleonThreadLocalonIBMDeveloperWorks》、《理解ThreadLocal》、《Managingdata:Goodexample》、《ReferJavaAPIDocs》5.什么时候抛出InvalidMonitorStateException异常,为什么?调用wait()/notify()/notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出IllegalMonitorStateException的异常(也就是说程序在没有执行对象的任何同步块或者同步方法
9、时,仍然尝试调用wait()/notify()/notifyAll()时)。由于该异常是RuntimeExcpetion的子类,所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为RuntimeException,此类异常不会在wait(),notify(),notifyAll()的方法签名提及。6.Sleep()、suspend()和wait()之间有什么区别?Thread.sleep()使当前线程在指定的时间处于“非运行”(NotRunnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入
10、该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方
11、法而不是thread。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另
此文档下载收益归作者所有