boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 有人在Java/J2EE项目中用过多线程/concurrent吗?
相关主题
Java 多线程 的架构如何改进?
我来说说go的目标对手吧
OOP里面的Object其实是actor
golang值得一学吗?
FMP vs ExecutorService/Future
java concurrency时,你们用的callable还是runnable?
core java里有跟C++ std::async类似的东西吗?
java笑node的
C++并发和Java并发有多大区别?
what are the ways for Java processes to communicate with each other
相关话题的讨论汇总
话题: thread话题: threadpool话题: java话题: actor话题: 多线程
进入Programming版参与讨论
1 (共1页)
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包,但没想好怎么利用。

相关主题
golang值得一学吗?
FMP vs ExecutorService/Future
java concurrency时,你们用的callable还是runnable?
core java里有跟C++ std::async类似的东西吗?
进入Programming版参与讨论
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.
相关主题
java笑node的
C++并发和Java并发有多大区别?
what are the ways for Java processes to communicate with each other
函数式语言是不是特别费系统资源?
进入Programming版参与讨论
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的吗?
相关主题
J2EE究竟指什么?
zhuang来来来,既然要聊聊多线程,我们就做点case study
请java大牛谈谈大并发的解决方案
常规应用多核有什么优势?
进入Programming版参与讨论
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

1 (共1页)
进入Programming版参与讨论
相关主题
what are the ways for Java processes to communicate with each other
函数式语言是不是特别费系统资源?
J2EE究竟指什么?
zhuang来来来,既然要聊聊多线程,我们就做点case study
请java大牛谈谈大并发的解决方案
常规应用多核有什么优势?
spring 是一个event loop一直在跑么?然后处理各种event?
scala 的感悟
Node做大系统better than Java, .NET
javascript怎么实现多线程
相关话题的讨论汇总
话题: thread话题: threadpool话题: java话题: actor话题: 多线程