17) 为什么wait, notify 和 notifyAll这些方法不在thread类里面?-达内培训负责整理
这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法.回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原因.一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得.如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了.如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了.简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象.
18) 什么是ThreadLocal变量?
ThreadLocal是Java里一种特殊的变量.每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了.它是为创建代价高昂的对象获取线程安全的好方法,比如你可以用ThreadLocal让SimpleDateFormat变成线程安全的,因为那个类创建代价高昂且每次调用都需要创建不同的实例所以不值得在局部范围使用它,如果为每个线程提供一个自己独有的变量拷贝,将大大提高效率.首先,通过复用减少了代价高昂的对象的创建个数.其次,你在没有使用高代价的同步或者不变性的情况下获得了线程安全.线程局部变量的另一个不错的例子是ThreadLocalRandom类,它在多线程环境中减少了创建代价高昂的Random对象的个数.
19) 什么是FutureTask?
在Java并发程序中FutureTask表示一个可以取消的异步运算.它有启动和取消运算、查询运算是否完成和取回运算结果等方法.只有当运算完成的时候结果才能取回,如果运算尚未完成get方法将会阻塞.一个FutureTask对象可以对调用了Callable和Runnable的对象进行包装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行.
20) Java中interrupted 和 isInterruptedd方法的区别?
interrupted() 和 isInterrupted()的主要区别是前者会将中断状态清除而后者不会.Java多线程的中断机制是用内部标识来实现的,调用Thread.interrupt()来中断一个线程就会设置中断标识为true.当中断线程调用静态方法Thread.interrupted()来检查中断状态时,中断状态会被清零.而非静态方法isInterrupted()用来查询其它线程的中断状态且不会改变中断状态标识.简单的说就是任何抛出InterruptedException异常的方法都会将中断状态清零.无论如何,一个线程的中断状态有有可能被其它线程调用中断来改变.
21) 为什么wait和notify方法要在同步块中调用?
主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常.还有一个原因是为了避免wait和notify之间产生竞态条件.
以上就是达内培训给大家做的内容详解,更多关于IT知识的学习,请继续关注达内培训