- 浏览: 627903 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
刚看到TimeUnit.SECONDS.sleep()方法时觉得挺奇怪的,这里怎么也提供sleep方法?
public void sleep(long timeout) throws InterruptedException {
if (timeout > 0) {
long ms = toMillis(timeout);
int ns = excessNanos(timeout, ms);
Thread.sleep(ms, ns);
}
}
结果一看源码,原来是对Thread.sleep方法的包装,实现是一样的,只是多了时间单位转换和验证,然而TimeUnit枚举成员的方法却提供更好的可读性,这可能就是当初创建TimeUnit时提供sleep方法的原因吧,大家都知道sleep方法很常用,但经常要使用一个常量保存sleep的时间,比如3秒钟,我们代码通常会这样写:
private final int SLEEP_TIME = 3 * 1000; //3 seconds
因为Thread.sleep方法参数接受的毫秒单位的数值,比较下面代码就知道TimeUnit枚举成员的sleep方法更优雅:
TimeUnit.MILLISECONDS.sleep(10);
TimeUnit.SECONDS.sleep(10);
TimeUnit.MINUTES.sleep(10);
Thread.sleep(10);
Thread.sleep(10*1000);
Thread.sleep(10*60*1000);
但使用TimeUnit枚举成员的sleep方法会不会带来性能损失了,毕竟增加了函数调用开销?
测试测试吧:
import java.util.concurrent.TimeUnit;
public class TestSleep {
public static void main(String[] args) throws InterruptedException {
sleepByTimeunit(10000);
sleepByThread(10000);
}
private static void sleepByTimeunit(int sleepTimes) throws InterruptedException {
long start = System.currentTimeMillis();
for(int i=0; i<sleepTimes; i++){
TimeUnit.MILLISECONDS.sleep(10);
}
long end = System.currentTimeMillis();
System.out.println("Total time consumed by TimeUnit.MILLISECONDS.sleep : " + (end - start));
}
private static void sleepByThread(int sleepTimes) throws InterruptedException {
long start = System.currentTimeMillis();
for(int i=0; i<sleepTimes; i++){
Thread.sleep(10);
}
long end = System.currentTimeMillis();
System.out.println("Total time consumed by Thread.sleep : " + (end - start));
}
}
两次测试结果(Win7+4G+JDK7 测试期间计算资源充足):
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100068
Total time consumed by Thread.sleep : 100134
Difference : -- -66
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100222
Total time consumed by Thread.sleep : 100077
Difference : -- +145
从结果可以看出10000次调用差异很小,甚至一次更快,不排除JVM进行了优化,如果忽略性能方面考虑,从可读性方面建议使用TimeUnit枚举成员的sleep方法。
另外TimeUnit是枚举实现一个很好的实例,Doug Lea太神了,佩服得五体投地!
出处:http://stevex.blog.51cto.com/4300375/1285767
参考:https://www.cnblogs.com/sanhuan/p/4826401.html
public void sleep(long timeout) throws InterruptedException {
if (timeout > 0) {
long ms = toMillis(timeout);
int ns = excessNanos(timeout, ms);
Thread.sleep(ms, ns);
}
}
结果一看源码,原来是对Thread.sleep方法的包装,实现是一样的,只是多了时间单位转换和验证,然而TimeUnit枚举成员的方法却提供更好的可读性,这可能就是当初创建TimeUnit时提供sleep方法的原因吧,大家都知道sleep方法很常用,但经常要使用一个常量保存sleep的时间,比如3秒钟,我们代码通常会这样写:
private final int SLEEP_TIME = 3 * 1000; //3 seconds
因为Thread.sleep方法参数接受的毫秒单位的数值,比较下面代码就知道TimeUnit枚举成员的sleep方法更优雅:
TimeUnit.MILLISECONDS.sleep(10);
TimeUnit.SECONDS.sleep(10);
TimeUnit.MINUTES.sleep(10);
Thread.sleep(10);
Thread.sleep(10*1000);
Thread.sleep(10*60*1000);
但使用TimeUnit枚举成员的sleep方法会不会带来性能损失了,毕竟增加了函数调用开销?
测试测试吧:
import java.util.concurrent.TimeUnit;
public class TestSleep {
public static void main(String[] args) throws InterruptedException {
sleepByTimeunit(10000);
sleepByThread(10000);
}
private static void sleepByTimeunit(int sleepTimes) throws InterruptedException {
long start = System.currentTimeMillis();
for(int i=0; i<sleepTimes; i++){
TimeUnit.MILLISECONDS.sleep(10);
}
long end = System.currentTimeMillis();
System.out.println("Total time consumed by TimeUnit.MILLISECONDS.sleep : " + (end - start));
}
private static void sleepByThread(int sleepTimes) throws InterruptedException {
long start = System.currentTimeMillis();
for(int i=0; i<sleepTimes; i++){
Thread.sleep(10);
}
long end = System.currentTimeMillis();
System.out.println("Total time consumed by Thread.sleep : " + (end - start));
}
}
两次测试结果(Win7+4G+JDK7 测试期间计算资源充足):
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100068
Total time consumed by Thread.sleep : 100134
Difference : -- -66
Total time consumed by TimeUnit.MILLISECONDS.sleep : 100222
Total time consumed by Thread.sleep : 100077
Difference : -- +145
从结果可以看出10000次调用差异很小,甚至一次更快,不排除JVM进行了优化,如果忽略性能方面考虑,从可读性方面建议使用TimeUnit枚举成员的sleep方法。
另外TimeUnit是枚举实现一个很好的实例,Doug Lea太神了,佩服得五体投地!
出处:http://stevex.blog.51cto.com/4300375/1285767
参考:https://www.cnblogs.com/sanhuan/p/4826401.html
发表评论
-
BigDecimal/Long 前后端交互失去精度解决方法
2024-01-22 10:31 385BigDecimal/Long 前后端交互失去精度解决方法 ... -
在Java 8中可以通过下面的方式获取Map对象的第一个元素
2023-12-18 13:48 321Java 8中如何获取Map对象的第一个元素 -
用EXCEL批量生成INSERT语句
2023-03-18 11:19 686用EXCEL批量生成INSERT语句 -
使用Java访问FTP文件时再次调用方法client.retrieveFileStream(ftpFile)会返回null的问题
2023-01-07 21:50 717使用Java访问FTP文件时再次调用方法client.retr ... -
java获取本月最后一天
2022-12-28 08:29 2338java获取本月第一天或者最后一天方法 @Test ... -
www
2022-11-12 09:03 0public void saveTransScheduleBi ... -
Notepad++删除代码中的注释,可删除//单行注释和/**/多行注释
2022-10-20 14:17 747Notepad++删除代码中的注释,可删除//单行注释和/** ... -
接口限流算法有哪些
2022-05-05 23:27 230接口限流的几种算法 接口限流算法有哪些? nginx限流方案 ... -
CompletableFuture学习记录
2022-04-25 18:00 225CompletableFuture学习记录 -
java单例模式几种实现方式
2022-04-18 11:48 237java单例模式几种实现方式 -
临时的几个网站
2022-03-31 13:33 251https://www.cnblogs.com/chengxu ... -
Java Stream - 如何filter带谓词
2022-03-23 23:53 232Java Stream Java Lambda语法 J ... -
URLConnection的连接、超时、关闭用法总结
2022-03-08 17:23 553URLConnection的连接、超时、关闭用法总结 jav ... -
关于java中的this::
2022-02-26 23:07 205关于java中的this:: -
StringRedisTemplate和RedisTemplate的区别和选择
2022-02-10 23:05 244StringRedisTemplate和RedisTempla ... -
ForkJoinPool初略分析
2022-02-10 11:44 269ForkJoinPool初略分析 多线程 ForkJoin ... -
service中@NotNull的使用
2022-01-23 13:48 1488@Validated和@NotNull加到什么上面,接口还是 ... -
Java8 Collectors.toMap的两个大坑
2022-01-21 15:54 304Java8 Collectors.toMap的两个大坑 -
踩坑之SimpleAsyncTaskExecutor
2022-01-13 20:50 805踩坑之SimpleAsyncTaskExecutor Sp ... -
都在建议你不要直接使用 @Async 注解
2022-01-10 11:54 759引用如果不自定义异步方法的线程池默认使用SimpleAsync ...
相关推荐
TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("当前线程状态:" + Thread.currentThread().getState()); } }); thread.start(); // 主线...
TimeUnit.SECONDS.sleep(3); flag = false; // 表示终止上面的线程 System.out.println("程序运行结束"); } ``` ### 总结 在实际开发过程中,推荐使用`interrupt()`方法或`volatile`标志位来优雅地中止线程,这...
在这个例子中,`TimeUnit.SECONDS.sleep(1)`等价于`Thread.sleep(1000)`,因为`TimeUnit.SECONDS.sleep(n)`会将秒数转换为毫秒数并调用`Thread.sleep()`。 除了`sleep()`方法,Java还提供了`Thread.yield()`方法,...
例如,你可以使用 `TimeUnit.SECONDS.sleep(10)` 而不是 `Thread.sleep(10000)`,这样使得代码意图更加明确。 2. **CopyOnWriteArrayList**: 这是一个线程安全的列表实现,特别适用于读取频繁而写入较少的情况。在...
TimeUnit.SECONDS.sleep(10); // 线程休眠后,该线程处于阻塞状态 } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class ThreadDemo { public static void main(String[] args...
TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个例子中,我们创建了一个最大并发线程数为5的Semaphore。当超过5个线程尝试执行`doSomeWork()`时,额外...
TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockB) { System.out.println(Thread.currentThread().getName() + "lock:" + lockB + "=>get" + ...
TimeUnit.SECONDS.sleep(1); // 延时1秒 ``` 3. **ScheduledExecutorService**:如果你需要更复杂的定时任务,比如定时执行、周期性执行,可以使用`java.util.concurrent.ScheduledExecutorService`。它提供了`...
Thread.sleep(5000); return "Result"; } }); try { String result = future.get(2, TimeUnit.SECONDS); // 设置2秒超时 System.out.println(result); } catch (TimeoutException e) { future.cancel(true); ...
在Java中,实现轮询可以使用各种方式,包括while循环、Thread.sleep()方法来控制间隔时间,以及使用ScheduledExecutorService来更精确地调度任务。下面是一个简单的轮询示例: ```java import java.util.concurrent...
TimeUnit.SECONDS.sleep(5); // 设置定时间隔,每5秒执行一次 } } catch (Exception e) { e.printStackTrace(); } finally { if (rs != null) { rs.close(); } if (pstmt != null) { pstmt.close(); } ...
TimeUnit.SECONDS.sleep(1); // 每秒检查一次 } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 如果被中断,恢复中断状态 break; } // 游戏逻辑 } } ``` 此外,我们还可以使用...
executor.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS); // 等待1秒后开始执行,之后每秒执行一次 Thread.sleep(2000); executor.shutdown(); } } 代码运行后,你会看到类似如下的输出: 13:11:45.268 ...
在Java中,可以使用`Thread.sleep()`方法来模拟延时,或者使用`ScheduledExecutorService`来创建更复杂的定时任务。 ```java import java.util.concurrent.Executors; import java.util.concurrent....
Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } long endTime = System.currentTimeMillis(); long endBytes = TrafficStats.getTotalRxBytes() + TrafficStats....
- **消灭Thread.Sleep()和大部分WaitForCondition**:在测试脚本中使用固定等待时间(Thread.Sleep)是非常不推荐的做法,因为它会导致执行效率低下,当页面或某些元素加载较快时,测试会无谓地等待,浪费资源;...
Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return false; } public void unlock(String lockKey) { String currentValue = redisTemplate....
executor.scheduleAtFixedRate(task, 0, 5, TimeUnit.SECONDS); // 每5秒执行一次 ``` 总结,Android子线程的应用主要在于避免阻塞主线程,提升用户体验。在处理图片这类耗时操作时,合理使用线程模型和定时机制...
executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS); } } ``` ScheduledExecutorService不仅提供了多线程支持,还可以根据需要调整延迟和执行间隔,使得定时任务的管理更加灵活和高效。...