软件英才网 软件行业驰名招聘网站
78 InputStream in =
socket.getInputStream();
79 int i = in.read();
这种情况在工作中已经碰到不止一次了。个人经验一般超时不要超过 20s。这里有一
个问题,connect 可以指定超时时间,但是 read 无法指定超时时间。但是可以设置阻塞
(block)时间。
正确的写法:
80 Socket socket = ...
81 socket.connect(remote, 20000); // fail after 20s
82 InputStream in = socket.getInputStream();
83 socket.setSoTimeout(15000);
84 int i = in.read();
另外,文件的读取(FileInputStream, FileChannel, FileDescriptor, File)没法指定
超时时间, 而且 IO 操作均涉及到本地方法调用, 这个更操作了 JVM 的控制范围,在分布式
文件系统中,对 IO 的操作内部实际上是网络调用。一般情况下操作 60s 的操作都可以认
为已经超时了。为了解决这些问题,一般采用缓存和异步/消息队列处理。
频繁使用计时器
错误代码:
85 for (...) {
86 long t = System.currentTimeMillis();
87 long t = System.nanoTime();
88 Date d = new Date();
89 Calendar c = new GregorianCalendar();
90 }
每次 new 一个 Date 或 Calendar 都会涉及一次本地调用来获取当前时间(尽管这个本
地调用相对其他本地方法调用要快)。
如果对时间不是特别敏感,这里使用了 clone 方法来新建一个 Date 实例。这样相对直接
new 要高效一些。
正确的写法:
91 Date d = new Date();
92 for (E entity : entities) {
93 entity.doSomething();
94 entity.setUpdated((Date) d.clone());
95 }
如果循环操作耗时较长 (超过几 ms),那么可以采用下面的方法,立即创建一个
Timer,然后定期根据当前时间更新时间戳,在我的系统上比直接 new 一个时间对象快
200 倍:
有需要请联系我们