日期:2014-05-20  浏览次数:20706 次

多线程运行顺序的一个问题
各位好

最近小弟在写socket的例子,其中用到了多线程。

遇到的问题是这样的,在server端,有一个线程专门负责接收,并存入公共容器container;另有一线程专门负责从container里取数据来处理,为了防止收过快或者处理过快,特作出了以下限制:

1.container里数据快满了时,收线程sleep 1秒,等待处理线程处理一下;
2.处理线程看到container里快没数据时,也sleep 1秒,等待收线程收一下。

但我发现,运行时,两个线程并不是无序地运行,而总是收线程先将container收满,处理线程再进行处理,然后收线程再将container收满。

以我个人的观点,这两个线程应该是乱序进行的,不是吗?

------解决方案--------------------
乱序是乱序,但你这个sleep 1秒,是不是太长了点。。。

1秒钟应该可以处理很多东西了吧,Sleep个10ms感觉都应该顶天了。


不过话说,为啥要防止接收过快或者处理过快呢?没看出必要性啊,没东西处理就轮空一次呗,可以用Thread.yield()释放时间片。
------解决方案--------------------
你用的容器用一个阻塞队列就能实现你要的效果了,
------解决方案--------------------
线程协作,队列空的时候,处理线程等待,队列满的时候,收线程等待,就是一个wait和notify的协调
------解决方案--------------------
卖大饼和吃大饼的问题。这个好像用直接不用管吧。处理之前判断集合有没有货啊。没货就空转。
------解决方案--------------------
低级的实现用 wait和notify控制;
高级点的用队列。