In String type we have several method valueOf static String valueOf(boolean b) static String valueOf(char c) static String valueOf(char[] data) static String valueOf(char[] data, int offset, int count) static String valueOf(double d) static String valueOf(float f) static String valueOf(int i) static String valueOf(long l) static String valueOf(Object obj) As we can see those method are… Read More


The rules below are not guidelines or recommendations, but strict rules. Contributions to Android generally will not be accepted if they do not adhere to these rules. Not all existing code follows these rules, but all new code is expected to. In This Document Code Style Guidelines for Contributors Java Language Rules Don’t Ignore Exceptions Don’t Catch… Read More


很多开发者谈到Java多线程开发,仅仅停留在new Thread(…).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读《Java并发编程实践》了解到了很多不为我知但又非常重要的细节,今日整理如下。 不应用线程池的缺点 有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(…).start(),对于一般场景是没问题的,但如果是在并发请求很高的情况下,就会有些隐患: 新建线程的开销。线程虽然比进程要轻量许多,但对于JVM来说,新建一个线程的代价还是挺大的,决不同于新建一个对象 资源消耗量。没有一个池来限制线程的数量,会导致线程的数量直接取决于应用的并发量,这样有潜在的线程数据巨大的可能,那么资源消耗量将是巨大的 稳定性。当线程数量超过系统资源所能承受的程度,稳定性就会成问题 制定执行策略 在每个需要多线程处理的地方,不管并发量有多大,需要考虑线程的执行策略 任务以什么顺序执行 可以有多少个任何并发执行 可以有多少个任务进入等待执行队列 系统过载的时候,应该放弃哪些任务?如何通知到应用程序? 一个任务的执行前后应该做什么处理 线程池的类型 不管是通过Executors创建线程池,还是通过Spring来管理,都得清楚知道有哪几种线程池: FixedThreadPool:定长线程池,提交任务时创建线程,直到池的最大容量,如果有线程非预期结束,会补充新线程 CachedThreadPool:可变线程池,它犹如一个弹簧,如果没有任务需求时,它回收空闲线程,如果需求增加,则按需增加线程,不对池的大小做限制 SingleThreadExecutor:单线程。处理不过来的任务会进入FIFO队列等待执行 SecheduledThreadPool:周期性线程池。支持执行周期性线程任务 其实,这些不同类型的线程池都是通过构建一个ThreadPoolExecutor来完成的,所不同的是corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory这么几个参数。具体可以参见JDK DOC。 线程池饱和策略 由以上线程池类型可知,除了CachedThreadPool其他线程池都有饱和的可能,当饱和以后就需要相应的策略处理请求线程的任务,ThreadPoolExecutor采取的方式通过队列来存储这些任务,当然会根据池类型不同选择不同的队列,比如FixedThreadPool和SingleThreadExecutor默认采用的是无限长度的LinkedBlockingQueue。但从系统可控性讲,最好的做法是使用定长的ArrayBlockingQueue或有限的LinkedBlockingQueue,并且当达到上限时通过ThreadPoolExecutor.setRejectedExecutionHandler方法设置一个拒绝任务的策略,JDK提供了AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy几种策略,具体差异可见JDK DOC 线程无依赖性 多线程任务设计上尽量使得各任务是独立无依赖的,所谓依赖性可两个方面: 线程之间的依赖性。如果线程有依赖可能会造成死锁或饥饿 调用者与线程的依赖性。调用者得监视线程的完成情况,影响可并发量 当然,在有些业务里确实需要一定的依赖性,比如调用者需要得到线程完成后结果,传统的Thread是不便完成的,因为run方法无返回值,只能通过一些共享的变量来传递结果,但在Executor框架里可以通过Future和Callable实现需要有返回值的任务,当然线程的异步性导致需要有相应机制来保证调用者能等待任务完成,关于Future和Callable的用法见下面的实例就一目了然了:   public class FutureRenderer {       private final ExecutorService executor = …;       void renderPage(CharSequence source) {           final List<ImageInfo> imageInfos = scanForImageInfo(source);           Callable<List<ImageData>> task =                   new Callable<List<ImageData>>() {                       public List<ImageData> call() {                           List<ImageData> result                                   = new ArrayList<ImageData>();                           for (ImageInfo imageInfo : imageInfos)                               result.add(imageInfo.downloadImage());                           return result;                       }                   };           Future<List<ImageData>> future =  executor.submit(task);           renderText(source);           try {               List<ImageData> imageData =  future.get();               for (ImageData data : imageData)                   renderImage(data);           } catch (InterruptedException e) {               // Re-assert the thread’s interrupted status               Thread.currentThread().interrupt();  … Read More


(自) Activity,Service属于主线程,在主线程中才能更新UI,如toast等。其他线程中不能直接使用,这时可以使用Handler来处理,Handler可以在Activity和Service中。 关于在非UI线程中进行UI操作会出现问题: Can’t create handler inside thread that has not called Looper.prepare() 这时有两种方式来解决: (一)在该非UI线程中创建消息队列(因为创建的工作线程默认是没有消息循环和消息队列的),Looper.prepare();…..;Looper.loop();   newThread() {  public void run() {  Looper.prepare(); //创建消息队列  todo();   Looper.loop();//进入消息循环 }}.start(); (二)运用Handler机制: package com.simon; import android.app.Activity;  import android.os.Bundle;  import android.os.Message;  import android.util.Log;  import android.os.Handler; public class MyHandler extends Activity {      static final String TAG = “Handler”;      Handler h = new… Read More


This story appeared on JavaWorld at http://www.javaworld.com/javatips/jw-javatip10.html Java Tip 10: Implement callback routines in Java Using interfaces to implement the equivalent<BR> of callback functions in Java By John D. Mitchell, JavaWorld.com, 06/01/96 Developers conversant in the event-driven programming model of MS-Windows and the X Window System are accustomed to passing function pointers that are invoked (that is, “called… Read More


有本书的源码是BIG5的,但Eclipse的“Text File Encoding”选项中没有“BIG5” 解决: 其实other的下拉选择框是一个ComboBox,你可以直接在里面手工输入! Refer: http://hi.baidu.com/zhuguoneng/blog/item/48a64634dc406f3c5ab5f514.html… Read More


我在使用BOOK: Professional Crystal Reports for VS.NET 的时候,经常出错: …..Assembles不能用。。。。 这里最好的解决办法是,1.重新安装.Net FrameWork,2. Select the Compile tab and click on the “Advanced Compile Options…” button. Find “Target CPU” and set it to x86. Next find “Target Framework” and set it to .NET Framework 4. 这下一切都好了。… Read More


不少时候在页面中为了布局的需要,下拉列表<select>的宽度需要设成比较小的值,这时如果恰巧它包含的选择项<option>的内容比较长,那么超出select宽度的部分将会被截断,如果option显示的内容又比较重要,必须完整地展现出来,或者你是个完美主义者,那这就成了一个不大不小的问题了。 在IE7+、Firefox中,由于支持了<option>的title属性,我们可以想办法给option标记设置title属性(内容可以与显示的值相同或者不同)。如果是已经做好的页面,不想再做太多改动,可以用下面的脚本,自动遍历页面上的所有<select>,给所有的option加上与text相同的title。 function SetOptionTitle() {     var selects = document.getElementsByTagName(“select”);     if (selects.length > 0)     {         for (var i = 0; i < selects.length; i++)         {             var options = selects[i].options;             if (selects[i].options.length > 0)             {                 for (var j = 0; j < options.length; j++)                 {                     if (options[j].title == “”)                         options[j].title = options[j].text;                 }             }         }     } } 很不幸的是,IE6并不支持<option>的title属性,这一方法在IE6下完全无效!鉴于目前的浏览器市场状况,我们还不得不尽力兼容IE6,所以只能另想其它办法。 我目前想到的办法是:当鼠标悬停到<select>时,创建一个这个下拉列表的副本,同时把焦点移到这个副本上,把副本的样式设成绝对定位,而且盖在原来的下拉列表上,宽度根据option的显示内容自动拉伸,当这个副本失去焦点,或者用户对它进行了选择操作后,获取副本的selectedIndex,赋给原来的select对象。具体代码如下: <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title></title> <script type=”text/javascript”> function FixWidth(selectObj) {     var newSelectObj = document.createElement(“select”);     newSelectObj = selectObj.cloneNode(true);     newSelectObj.selectedIndex = selectObj.selectedIndex;     newSelectObj.onmouseover = null;          var e = selectObj;     var absTop = e.offsetTop;     var absLeft = e.offsetLeft;     while(e = e.offsetParent)     {         absTop += e.offsetTop;         absLeft += e.offsetLeft;     }     with (newSelectObj.style)     {         position = “absolute”;         top = absTop + “px”;         left = absLeft + “px”;         width = “auto”;     }          var rollback = function(){ RollbackWidth(selectObj, newSelectObj); };     if(window.addEventListener)     {… Read More