那么问题是我怎么知道5个线程都sleep了呢?
解决方案 »
- java IO问题:将一个txt文件去重并排序输出 帮忙看下下面代码有什么问题
- 我是学习C#的,要学Java应该看哪类教材好呢?
- java中有哪几种数据库的增删改查?
- 请问Mac OS X上怎么取得系统文件(例如,Desktop)的图标图像
- applet怎么调用打印机,直接打印Text里面的内容?
- 如何将JOptionPane中消息框按钮上的字改成英文。急!
- java 的每个类的控件个数有限制吗
- 关于Import的问题
- 怎樣將"YYYY-MM-DD HH-MM-SS"格式的字符串轉換成日期型.
- 帮忙将这棵树加上滚动条!(付代码)
- 请教关于jbuilder的"设计时运行"(我这么叫的)的机制??
- drugon(personal)先谢过,进来接分!!!!!!!
class th extends Thread {
public static sleepNumber=0;
public void run() {
....
sleep();sleepNumber++;
..}
}if(th.sleepNumber==5) break;大概就是用一个static变量来记录sleep的线程数量
...
Thread1.sleep();sign++;
...
通过变量的值来判断
也就是只有在实在没有数据要处理了,才会不停的sleep.然后大家都sleep了。才可以让自己这个线程结束。 这时候,5个线程就都会结束
不是说5个都sleep了就可以退出循环了吗?
你看这样是不是你想要的
while(true) {
if(th.sleepNumber==5) {
Thread.sleep(2000);
if(th.sleepnumber==5) break;
}
就是说当5个都sleep了,然后在等一会判断还是不是仍然5个都sleep
另外起一个线程监控他们!
也不好啊。我想过了,比如数据库里面实在没有数据要处理了,
如果出现下面的情况怎么办?
++达到4了,sleep后--恢复到3。然后另外一个线程进来,
++达到4,sleep后--又恢复到3。结果导致没完没了的这样做无用功
另外起一个线程监控他们!kenli(心相续)说的也不错
我的思路是这样,但好像不管用while(true)
{
//从数据库取数据并处理
myRequest a = getRequest(...);if(a!=null)
{
a.... //有数据则作相应的处理。
notifyAll(); //即其中有一个线程发现有事情做,则唤醒所有线程来做。}
else //if(a==null)
{ number ++;
if(number < 5)
{
wait(); //本线程从数据库找不到内容则wait阻塞,相当于一直sleep吧。
}
else
{//5个都要wait则break;
notifyAll(); //先唤醒所有线程到下面break这一步。
break;
}
}
用变量和notify结合起来,每次不唤醒所有的线程,每次只唤醒一个,唤醒一个之后就马上--,这样就可以保证记录sleep的线程数量就不会错了。另外楼上的,notify才是只唤醒一个线程,而notifyAll则是唤醒所有sleep的线程,从名字上都可以看出来,不要搞错了。