那么问题是我怎么知道5个线程都sleep了呢?

解决方案 »

  1.   

    可以通过isAlive() 来判断吧
      

  2.   

    很简单啊
    class th extends Thread {
    public static sleepNumber=0;
    public void run() {
    ....
    sleep();sleepNumber++;
    ..}
    }if(th.sleepNumber==5) break;大概就是用一个static变量来记录sleep的线程数量
      

  3.   

    sign=0;
    ...
    Thread1.sleep();sign++;
    ...
    通过变量的值来判断
      

  4.   

    可能有些还没有说清楚,是只sleep一会儿,因为while死循环,又会去看看数据库(myRequest a = getRequest(...);  ) 。有数据的话,就不停的while处理了。
    也就是只有在实在没有数据要处理了,才会不停的sleep.然后大家都sleep了。才可以让自己这个线程结束。 这时候,5个线程就都会结束
      

  5.   

    用sleepNumber++;这种方法不行。上面说到了,sleep后它有可能又去处理数据了。
      

  6.   

    还不是很明白
    不是说5个都sleep了就可以退出循环了吗?
    你看这样是不是你想要的
    while(true) {
    if(th.sleepNumber==5) {
    Thread.sleep(2000);
    if(th.sleepnumber==5) break;
    }
    就是说当5个都sleep了,然后在等一会判断还是不是仍然5个都sleep
      

  7.   

    先++, 然后sleep, 完事后--
    另外起一个线程监控他们!
      

  8.   

    先++, 然后sleep, 完事后--
    也不好啊。我想过了,比如数据库里面实在没有数据要处理了,
    如果出现下面的情况怎么办?
    ++达到4了,sleep后--恢复到3。然后另外一个线程进来,
    ++达到4,sleep后--又恢复到3。结果导致没完没了的这样做无用功
      

  9.   

    先++, 然后sleep, 完事后--
    另外起一个线程监控他们!kenli(心相续)说的也不错
      

  10.   

    可能sleep的问题吧。也许不应该用sleep因为sleep一会儿就会醒来,然后又少了一个sleep的,结果可能导致 在同一个时间不会5个同时sleep(尽管数据库中根本没有数据可以处理),这样就永远无法判断结果 从而退出。
      

  11.   

    怎么用wait。 notifyAll实现啊。 
    我的思路是这样,但好像不管用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;  
      }
    }
      

  12.   

    当然作++时候我是用一个同步函数去做。此处是伪代码。好像是notifyAll不是唤醒所有的线程,如果是的话,我认为这样就 可以解决问题了。
      

  13.   

    仅用一个变量是做不到的。因为你只会记下它第一次sleep的数字,如果一个线程多次被sleep,这样记录sleep线程数量的那个变量没有办法准确记下,因为在线程sleep的时候你可以++,但它是什么时候运行,你没有办法去控制,所以你没有办法去--,这样变量记录的就不准了。
    用变量和notify结合起来,每次不唤醒所有的线程,每次只唤醒一个,唤醒一个之后就马上--,这样就可以保证记录sleep的线程数量就不会错了。另外楼上的,notify才是只唤醒一个线程,而notifyAll则是唤醒所有sleep的线程,从名字上都可以看出来,不要搞错了。