1.捕获了异常后,如何获取完整的堆栈轨迹(stack trace)
String fullStackTrace =org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e)Thread.currentThread().getStackTrace();
2.实现Runnable接口 VS. 继承Thread类
一般而言,推荐使用方式(1),主要是由于大多数情况下,人们并不会特别去关注线程的行为,也不会去改写Thread已有的行为或方法,仅仅是期望执行任务而已。 因此,使用接口的方式能避免引入一些并不需要的东西,同时也不会影响继承其他类,并使程序更加灵活。 额外的tips :Runnable与Thread不是对等的概念 在Thinking in Java中,作者吐槽过Runnable的命名,称其叫做Task更为合理。 在Java中,Runnable只是一段用于描述任务的代码段而已,是静态的概念,需要通过线程来执行。而Thread更像是一个活体,自身就具有很多行为,能够用来执行任务。仅仅当你确实想要重写(override)一些已有行为时,才使用继承,否则请使用接口。 3.HashMap和Hashtable的区别? 哪一个对于多线程应用程序更好? Hashtable是同步的,加了synchronized锁,而HashMap不是。没有加synchronized锁的对象,性能通常比加了synchronized锁的对象要更好一些,因此,如果是非多线程程序,不需要考虑锁、同步等问题,那么使用HashMap更好。 Hashtable不允许有空的键或值。HashMap允许空键和空值。 HashMap有一个子类LinkedHashMap,对这个类对象进行迭代时,它的顺序是有序的(按插入顺序排序)。如有需要,你也能轻易的从LinkedHashMap转化成HashMap。Hashtable就没那么简单了, 总之,如果你无需关心同步(synchronized)问题,我会建议用HashMap。反之,你可以考虑使用ConcurrentHashMap