s****y 发帖数: 503 | 1 在Java/J2EE(比如Struts2/Spring/Hibernate)实际项目中有用过多线程吗?比如
java.util.concurrent包?
都实现什么功能?用了那些API? |
d****i 发帖数: 4809 | 2 好像传统的J2EE不鼓励(或者禁止)你用多线程,因为app server像weblogic,
glassfish等等都已经帮你take care了,你用了自己搞的多线程反而破坏了container
的完整性。参见以下:
http://stackoverflow.com/questions/533783/why-spawning-threads-
Spring是另外一回事,因为不需要运行在container里面,可以standalone的
application运行,所以按照一般的多线程也可以。
PS: 以上说法可能不一定正确,如有错误请好虫, wwzz等Java大牛指正
【在 s****y 的大作中提到】 : 在Java/J2EE(比如Struts2/Spring/Hibernate)实际项目中有用过多线程吗?比如 : java.util.concurrent包? : 都实现什么功能?用了那些API?
|
g*****g 发帖数: 34805 | 3 原则就是不要乱开线程,要用 config好的 threadpool, 要让 container管理这样
shutdown server的时候是可控的。spring也是个 container.
虽然不用管理 pool, 还是多线程,有没有问题在于有没有共享资源。比如一个 bean里
有个简单计数器,是一定会出问题的。
container
【在 d****i 的大作中提到】 : 好像传统的J2EE不鼓励(或者禁止)你用多线程,因为app server像weblogic, : glassfish等等都已经帮你take care了,你用了自己搞的多线程反而破坏了container : 的完整性。参见以下: : http://stackoverflow.com/questions/533783/why-spawning-threads- : Spring是另外一回事,因为不需要运行在container里面,可以standalone的 : application运行,所以按照一般的多线程也可以。 : PS: 以上说法可能不一定正确,如有错误请好虫, wwzz等Java大牛指正
|
s****y 发帖数: 503 | 4
你说的的threadpool指的是什么?
【在 g*****g 的大作中提到】 : 原则就是不要乱开线程,要用 config好的 threadpool, 要让 container管理这样 : shutdown server的时候是可控的。spring也是个 container. : 虽然不用管理 pool, 还是多线程,有没有问题在于有没有共享资源。比如一个 bean里 : 有个简单计数器,是一定会出问题的。 : : container
|
g*****g 发帖数: 34805 | 5 threadpool就是 threadpool, 通常是 ExecutorService的子类。
【在 s****y 的大作中提到】 : : 你说的的threadpool指的是什么?
|
T*****e 发帖数: 361 | 6 我用过Java的多线程,跟Spring/Hibernate一起用。当时从Java5开始做的,没有用到
很高级的功能,直接裸奔Thread。
我们有大概十台服务器,每台上有数量不等的CPU/Core。总的来说对于每个服务器上各
个JVM Instance上跑的数据处理线程数目的上限就是CPU/Core的数量,另外每个工作线
程配备一个监测线程,以保证死掉的工作线程能够及时被终止或者其他异常的报告。之
外有一两个线程负责工作调度、系统监测以及异常报告等。
刚开始设计实现时没啥经验,后来试图了解更新的concurrent包,但没想好怎么利用。 |
l**********n 发帖数: 8443 | 7 上WebSocket或者Streaming。另外可以上AKKA啊 |
g*****g 发帖数: 34805 | 8 You should use threadpool and built in JMX for monitoring.
【在 T*****e 的大作中提到】 : 我用过Java的多线程,跟Spring/Hibernate一起用。当时从Java5开始做的,没有用到 : 很高级的功能,直接裸奔Thread。 : 我们有大概十台服务器,每台上有数量不等的CPU/Core。总的来说对于每个服务器上各 : 个JVM Instance上跑的数据处理线程数目的上限就是CPU/Core的数量,另外每个工作线 : 程配备一个监测线程,以保证死掉的工作线程能够及时被终止或者其他异常的报告。之 : 外有一两个线程负责工作调度、系统监测以及异常报告等。 : 刚开始设计实现时没啥经验,后来试图了解更新的concurrent包,但没想好怎么利用。
|
|
c******f 发帖数: 243 | 9 只用过future + executor service + callable/runnable...
多线的traffic,netty用的比较多 |
k**********g 发帖数: 989 | 10
首先所有底层的第三方代码要进行代码审查,看看有没有要修补,要上锁或加倍留意的
地方,例如mutable singleton,thread local data。其中的「锁」会用两种方式确保
正确运作而不锁死∶数据依赖和任务依赖。巩固代码後,下面的工作可分为三方面∶任
务包装,数据包装,界面包装。这包装和encapsulation不同,本质是换汤不换药,不
过是把代码结构稍为修改了。任务包装是把可执行的耗时任务分割为单元,细分为CPU
intensive和IO intensive,再分装为Callable。要确保每一个单元提交到Executor後
,能在任意thread成功执行。数据包装是把数据分类为Write once read many(WORM)或
是mutable。WORM会变成Futures。Mutable按需要可能改写成immutable pattern(类似
copy on modify)或用上述的依赖链使其单线程化。(即使单线程化,不相关的任务仍
可并列执行。)界面包装是把上述的改写用最简洁易用的方式表达,确保接口的组合性
(composability)。
经常会用到 Functor 的概念,就是某函数会返回一个object,这object包装了一些可
执行代码。
Actor model其实和explicit thread分别不大,甚至也保留了deadlock的可能性(如果
有两个或以上的Actor交换信息而且对输入数据的时序敏感)。一般来说会把Actor
model分解成task and data,然後把Actor model的输入输出换成queue。
【在 T*****e 的大作中提到】 : 我用过Java的多线程,跟Spring/Hibernate一起用。当时从Java5开始做的,没有用到 : 很高级的功能,直接裸奔Thread。 : 我们有大概十台服务器,每台上有数量不等的CPU/Core。总的来说对于每个服务器上各 : 个JVM Instance上跑的数据处理线程数目的上限就是CPU/Core的数量,另外每个工作线 : 程配备一个监测线程,以保证死掉的工作线程能够及时被终止或者其他异常的报告。之 : 外有一两个线程负责工作调度、系统监测以及异常报告等。 : 刚开始设计实现时没啥经验,后来试图了解更新的concurrent包,但没想好怎么利用。
|
|
|
w**z 发帖数: 8232 | 11 我本人在tomcat 里用过一次ExecutorService. 有个request 进来,要update
multiple Cassandra row,
一般情况下,在servlet container 里不用自己threadpool, container 已经有了自
己的 service thread pool. 每个request 都分配一个service thread
后来tomcat 加了 nio
http://java.dzone.com/articles/understanding-tomcat-nio
【在 s****y 的大作中提到】 : 在Java/J2EE(比如Struts2/Spring/Hibernate)实际项目中有用过多线程吗?比如 : java.util.concurrent包? : 都实现什么功能?用了那些API?
|
n*********u 发帖数: 1030 | 12
我有些native library产生的object,init比较慢,内存消耗也有点大。
让tomcat之类的自己管理thread的话,每个thread都要init一遍(慢),thread多的话
总内存消耗也会很厉害。
所以放个threadpool在那儿共享几个这样的object会比较好吧?
【在 w**z 的大作中提到】 : 我本人在tomcat 里用过一次ExecutorService. 有个request 进来,要update : multiple Cassandra row, : 一般情况下,在servlet container 里不用自己threadpool, container 已经有了自 : 己的 service thread pool. 每个request 都分配一个service thread : 后来tomcat 加了 nio : http://java.dzone.com/articles/understanding-tomcat-nio :
|
w**z 发帖数: 8232 | 13 为什么每个request 都要init object, sprint created object default is
singleton
【在 n*********u 的大作中提到】 : : 我有些native library产生的object,init比较慢,内存消耗也有点大。 : 让tomcat之类的自己管理thread的话,每个thread都要init一遍(慢),thread多的话 : 总内存消耗也会很厉害。 : 所以放个threadpool在那儿共享几个这样的object会比较好吧?
|
g*****g 发帖数: 34805 | 14 That's called object pool. If your object is not thread safe, it's OK to
have an object pool. But you don't want to tie threads to it.
【在 n*********u 的大作中提到】 : : 我有些native library产生的object,init比较慢,内存消耗也有点大。 : 让tomcat之类的自己管理thread的话,每个thread都要init一遍(慢),thread多的话 : 总内存消耗也会很厉害。 : 所以放个threadpool在那儿共享几个这样的object会比较好吧?
|
l**********n 发帖数: 8443 | 15 可以用Future。可以把任务放在一个queue里,然后任务线程从queue里取任务执行。结
果放在另一个queue里。如果queue空了,最后用Thread.join() in your main thread
to wait in a blocking fashion for each Thread to complete。 |
g*****g 发帖数: 34805 | 16 Threads in threadpool typically don't die, instead of using Thread.join, you
should simple block on Fugure.get
thread
【在 l**********n 的大作中提到】 : 可以用Future。可以把任务放在一个queue里,然后任务线程从queue里取任务执行。结 : 果放在另一个queue里。如果queue空了,最后用Thread.join() in your main thread : to wait in a blocking fashion for each Thread to complete。
|
h****r 发帖数: 2056 | 17 block on Fugure.get, 好像容易造成thread leak,尤其是有I/O的情况.
经常是jstack发现thread数目在增加,原因是有一些thread在死等i/o,
加上timeout也不是都能解决死等i/o的问题。
这种情况下,executor service(也即thread pool)没有avaialble
thread可用,只好为新request开新的thread,老的thread就继续死等
(或者是有某种exception没有handle而死了)leak掉了。
you
【在 g*****g 的大作中提到】 : Threads in threadpool typically don't die, instead of using Thread.join, you : should simple block on Fugure.get : : thread
|
g*****g 发帖数: 34805 | 18 I don't think so. Blocking on future get is not polling.
【在 h****r 的大作中提到】 : block on Fugure.get, 好像容易造成thread leak,尤其是有I/O的情况. : 经常是jstack发现thread数目在增加,原因是有一些thread在死等i/o, : 加上timeout也不是都能解决死等i/o的问题。 : 这种情况下,executor service(也即thread pool)没有avaialble : thread可用,只好为新request开新的thread,老的thread就继续死等 : (或者是有某种exception没有handle而死了)leak掉了。 : : you
|
w**z 发帖数: 8232 | 19 it depends on which kind if thread pool the executor service us using.
whether the thread finishes the task has nothing to do with future.get.
【在 h****r 的大作中提到】 : block on Fugure.get, 好像容易造成thread leak,尤其是有I/O的情况. : 经常是jstack发现thread数目在增加,原因是有一些thread在死等i/o, : 加上timeout也不是都能解决死等i/o的问题。 : 这种情况下,executor service(也即thread pool)没有avaialble : thread可用,只好为新request开新的thread,老的thread就继续死等 : (或者是有某种exception没有handle而死了)leak掉了。 : : you
|
h****r 发帖数: 2056 | 20 这个跟polling确实没有关系。既然blocking了,也无所谓polling了.
不过这个blocking确实是thread死掉的直接或者间接原因。
【在 g*****g 的大作中提到】 : I don't think so. Blocking on future get is not polling.
|
|
|
h****r 发帖数: 2056 | 21
这句话有点武断了。
【在 w**z 的大作中提到】 : it depends on which kind if thread pool the executor service us using. : whether the thread finishes the task has nothing to do with future.get.
|
g*****g 发帖数: 34805 | 22 如果你的 task不返回,那当然是个问题。但 block在 future上不是问题的根源。
【在 h****r 的大作中提到】 : 这个跟polling确实没有关系。既然blocking了,也无所谓polling了. : 不过这个blocking确实是thread死掉的直接或者间接原因。
|
w**z 发帖数: 8232 | 23 具体点?有了future get, thread 就stuck, 去掉 future get, 就好了?It does
not make sense.
【在 h****r 的大作中提到】 : : 这句话有点武断了。
|
g*****g 发帖数: 34805 | 24 所有的外部IO都必须有timeout,Java缺省是无timeout block在 IO上,也许他碰到的
是这
样的问题。
【在 w**z 的大作中提到】 : 具体点?有了future get, thread 就stuck, 去掉 future get, 就好了?It does : not make sense.
|
w**z 发帖数: 8232 | 25 那关future get 啥事?
【在 g*****g 的大作中提到】 : 所有的外部IO都必须有timeout,Java缺省是无timeout block在 IO上,也许他碰到的 : 是这 : 样的问题。
|
T*****e 发帖数: 361 | 26 哈哈,当时用多线程已经是头一次了,很多方面都没考虑到/对,还是走了一些弯路的
。threadpool当时没用好像是因为没有看到线程配对(一个工作一个监测控制)的例子
,自己不知道如何着手。
JMX没有接触过,到现在也只是听说过。看来有空可以看看。
当时考虑过用Message Queue来做调度,不过没找到persistency和recovery方面的资料
(主要是这个也是似懂非懂),后来直接把调度做成数据库的更新与查询了事。
后来学scala的actor,觉得akka的actor就挺好挺简单,不过重写是不可能了。
【在 g*****g 的大作中提到】 : You should use threadpool and built in JMX for monitoring.
|
z****e 发帖数: 54598 | 27 rxjava出来了
用subscribe了
就不需要block了
【在 h****r 的大作中提到】 : block on Fugure.get, 好像容易造成thread leak,尤其是有I/O的情况. : 经常是jstack发现thread数目在增加,原因是有一些thread在死等i/o, : 加上timeout也不是都能解决死等i/o的问题。 : 这种情况下,executor service(也即thread pool)没有avaialble : thread可用,只好为新request开新的thread,老的thread就继续死等 : (或者是有某种exception没有handle而死了)leak掉了。 : : you
|
z****e 发帖数: 54598 | 28 看看vertx和rxjava
你会觉得更简单
hoho
【在 T*****e 的大作中提到】 : 哈哈,当时用多线程已经是头一次了,很多方面都没考虑到/对,还是走了一些弯路的 : 。threadpool当时没用好像是因为没有看到线程配对(一个工作一个监测控制)的例子 : ,自己不知道如何着手。 : JMX没有接触过,到现在也只是听说过。看来有空可以看看。 : 当时考虑过用Message Queue来做调度,不过没找到persistency和recovery方面的资料 : (主要是这个也是似懂非懂),后来直接把调度做成数据库的更新与查询了事。 : 后来学scala的actor,觉得akka的actor就挺好挺简单,不过重写是不可能了。
|
l**********n 发帖数: 8443 | 29 rxjava是基于netty的吗?
【在 z****e 的大作中提到】 : rxjava出来了 : 用subscribe了 : 就不需要block了
|
z****e 发帖数: 54598 | 30 好像是
有一个子项目叫做rxnetty好像
先让netty实现异步,然后再基于这个造出rxjava
【在 l**********n 的大作中提到】 : rxjava是基于netty的吗?
|
|
|
l**********n 发帖数: 8443 | 31 rxjava是netflix的项目。
【在 z****e 的大作中提到】 : 好像是 : 有一个子项目叫做rxnetty好像 : 先让netty实现异步,然后再基于这个造出rxjava
|
z****e 发帖数: 54598 | 32 是啊
主要作者是古德霸的同僚
这种跨公司协作的开源项目在java里面不是到处都是么?
vert.x是rh的,netty是那个韩国人做的
【在 l**********n 的大作中提到】 : rxjava是netflix的项目。
|
d*******r 发帖数: 3299 | 33 """
Actor model其实和explicit thread分别不大,甚至也保留了deadlock的可能性(如果
有两个或以上的Actor交换信息而且对输入数据的时序敏感)。一般来说会把Actor
model分解成task and data,然後把Actor model的输入输出换成queue。
"""
我也是觉得其实各种隐式的lock和race condition其实是无法避免的。
Actor 这些东西只是强迫大家多做解耦,然后少产生lock而已,有些lock还是不能避免
地用另外一种形式实现了.
CPU
【在 k**********g 的大作中提到】 : : 首先所有底层的第三方代码要进行代码审查,看看有没有要修补,要上锁或加倍留意的 : 地方,例如mutable singleton,thread local data。其中的「锁」会用两种方式确保 : 正确运作而不锁死∶数据依赖和任务依赖。巩固代码後,下面的工作可分为三方面∶任 : 务包装,数据包装,界面包装。这包装和encapsulation不同,本质是换汤不换药,不 : 过是把代码结构稍为修改了。任务包装是把可执行的耗时任务分割为单元,细分为CPU : intensive和IO intensive,再分装为Callable。要确保每一个单元提交到Executor後 : ,能在任意thread成功执行。数据包装是把数据分类为Write once read many(WORM)或 : 是mutable。WORM会变成Futures。Mutable按需要可能改写成immutable pattern(类似 : copy on modify)或用上述的依赖链使其单线程化。(即使单线程化,不相关的任务仍
|
z****e 发帖数: 54598 | 34 应该不对
【在 d*******r 的大作中提到】 : """ : Actor model其实和explicit thread分别不大,甚至也保留了deadlock的可能性(如果 : 有两个或以上的Actor交换信息而且对输入数据的时序敏感)。一般来说会把Actor : model分解成task and data,然後把Actor model的输入输出换成queue。 : """ : 我也是觉得其实各种隐式的lock和race condition其实是无法避免的。 : Actor 这些东西只是强迫大家多做解耦,然后少产生lock而已,有些lock还是不能避免 : 地用另外一种形式实现了. : : CPU
|