java多线程问题

S1cKle 2019-01-22 11:49:12
有这样一个事情


ExecutorService executor = Executor.newFixedThreadPool(6);
while(true){
for(int i =0;i<6;i++){
executor.submit(()->{
// do something
});
}
try{
executor.awaitTermination(1,TimeUnit.MILLISCOUNTS);
}catch{
logger.error(e);
}
}


我会创建一个线程池6个线程跑
跑完这6个线程,则继续创建6个线程继续
之前用的while(true) 然后检查isTerminated() 线程是否结束判断
昨天无意间发现了这个awaitTermination() 发现不仅占用的内存变小了
而且效率提升了2-3倍
但是看了部分相关资料,都是跟关闭线程池一起使用。
所以我不确定我这样用有没有问题。因为我是不关闭线程池一直创建线程的。所以请各位大神帮忙看看 这样有什么隐患没有
...全文
133 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
S1cKle 2019-01-22
  • 打赏
  • 举报
回复
引用 3 楼 敏敏诶呦喂 的回复:
当前线程阻塞,直到
等所有已提交的任务(包括正在跑的和队列中等待的)执行完
或者等超时时间到
或者线程被中断,抛出InterruptedException
然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)
我也没在意过这种问题,只能和你一起讨论讨论。你可以尝试把时间调长一点。你这个超时时长设置的1毫秒。看下它的返回值是多少》》》executor.awaitTermination(1,TimeUnit.MILLISCOUNTS)。


返回值的话肯定是false 测试也是false 因为线程池一直没被关闭

dosomnething的位置是对数据进行解析 实际消耗时间小于1毫秒

因为解析数据量要求每秒1W+ 所以等待设置时间不会很长

我测试的时候 1毫秒足够了 就是不知道有没有数据没被处理。然后就中断。

用这个awaitTermination是不是等待线程执行完成之后 才会继续下面的代码 如果超时就抛出异常 还是怎么的?
_小石头_ 2019-01-22
  • 打赏
  • 举报
回复
当前线程阻塞,直到 等所有已提交的任务(包括正在跑的和队列中等待的)执行完 或者等超时时间到 或者线程被中断,抛出InterruptedException 然后返回true(shutdown请求后所有任务执行完毕)或false(已超时) 我也没在意过这种问题,只能和你一起讨论讨论。你可以尝试把时间调长一点。你这个超时时长设置的1毫秒。看下它的返回值是多少》》》executor.awaitTermination(1,TimeUnit.MILLISCOUNTS)。
S1cKle 2019-01-22
  • 打赏
  • 举报
回复
引用 1 楼 LCL_data 的回复:
awaitTermination方法:接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。



这个只是等待1s,然后告诉你 线程都关闭没。


https://blog.csdn.net/wo541075754/article/details/51564359


我在想你为啥不在线程里面while(true)呢,就是先申请6个线程,然后线程内部用while(true)的方式来调用自己的函数


我做的是一个kafka消费数据的处理方法
while(true)是不断的消费kafka里面的数据 一条数据创建一个线程 怼数据进行解析
6个线程是处理6条数据 当着6个数据处理完了 在创建6个线程去处理下面的数据
所以只能这样用。
十八道胡同 2019-01-22
  • 打赏
  • 举报
回复
awaitTermination方法:接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。



这个只是等待1s,然后告诉你 线程都关闭没。


https://blog.csdn.net/wo541075754/article/details/51564359


我在想你为啥不在线程里面while(true)呢,就是先申请6个线程,然后线程内部用while(true)的方式来调用自己的函数
S1cKle 2019-01-22
  • 打赏
  • 举报
回复
引用 7 楼 敏敏诶呦喂 的回复:
[quote=引用 4 楼 S1cKle 的回复:]
返回值的话肯定是false 测试也是false 因为线程池一直没被关闭

dosomnething的位置是对数据进行解析 实际消耗时间小于1毫秒

因为解析数据量要求每秒1W+ 所以等待设置时间不会很长

我测试的时候 1毫秒足够了 就是不知道有没有数据没被处理。然后就中断。

用这个awaitTermination是不是等待线程执行完成之后 才会继续下面的代码 如果超时就抛出异常 还是怎么的?


是的 线程里面的程序都会被执行,只不过在执行的线程数大于6时会阻塞,等待里面的线程执行完成后再往里面添加的。[/quote]

哦了 如果这么说。那应该就可以了。谢了
_小石头_ 2019-01-22
  • 打赏
  • 举报
回复
引用 4 楼 S1cKle 的回复:
返回值的话肯定是false 测试也是false 因为线程池一直没被关闭 dosomnething的位置是对数据进行解析 实际消耗时间小于1毫秒 因为解析数据量要求每秒1W+ 所以等待设置时间不会很长 我测试的时候 1毫秒足够了 就是不知道有没有数据没被处理。然后就中断。 用这个awaitTermination是不是等待线程执行完成之后 才会继续下面的代码 如果超时就抛出异常 还是怎么的?
是的 线程里面的程序都会被执行,只不过在执行的线程数大于6时会阻塞,等待里面的线程执行完成后再往里面添加的。
别闹腰不好 2019-01-22
  • 打赏
  • 举报
回复
先了解下Executor.newFixedThreadPool(6); 线程池的原理, 核心线程数和最大线程数都是6,也就是说最大也就6个线程在工作。 等待队列采用的是无界队列,所以等待队列不会满。 也就是说你 可以无限的创建线程,是没有问题的。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧