public class ThreadTest extends Thread { public void run() {
while(true){
System.out.println(this.getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) throws Exception {
ThreadTest t = new ThreadTest();
t.start();

t.wait();//这样是错的
}
}能否在main线程中调用其他线程的wait(),使之等待
是否wait()只能由自身线程调用?那想要调用wait()来实现使其他线程等待,那要如何实现呢?(不在while()中用标示)

解决方案 »

  1.   

     t.wait();//这样是错的
    wait一个要在同步方法或者同步块里面synchronized
      

  2.   

    wait方法是会释放锁,如果你的方法不是同步的,那线程根本就不会获得锁,何来释放锁之说呢!notify(),notifyAll()也都要在synchronized里面!不这么做的话你也可以使用sleep去代替wait
      

  3.   

    wait方法是会释放锁,如果你的方法不是同步的,那线程根本就不会获得锁,何来释放锁之说呢!notify(),notifyAll()也都要在synchronized里面!不这么做的话你也可以使用sleep去代替wait这种说法更好说明了sleep与wait用法的区别
      

  4.   

    学习了
    顺便引一篇相关的老帖,看5楼的回答。
    http://topic.csdn.net/t/20030902/02/2213119.html
      

  5.   

    没有synchronized,不能wait()
    可以sleep()
      

  6.   

    这样?也不行啊
    public class ThreadTest extends Thread { public void run() {
    while(true){
    System.out.println(this.getName());
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }

    public synchronized void pause(){
    try {
    this.wait();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public static void main(String[] args) throws InterruptedException {
    ThreadTest t = new ThreadTest();
    t.start();

    t.pause();
    }
    }
      

  7.   

    我也是刚学Java,看到多线程这一块,为什么LZ非要把wait放在线程类中呢。我看的例子都是放在公用的资源块中的吧。而且得放一个notify吧,不然怎么取消等待呢。感觉我们还是应该先理解下书本啊。
      

  8.   

    我看到书上有个例子是这样的,在线程类中加入个Flag,然后if(flag)就wait,否则不wait,然后再在线程类中加入一个设置flag的函数,和一个notify这个线程的函数,来完成 挂起与唤醒的。
      

  9.   

    你这个好像是wait住了主线程了,而不是那个t,应该放在 t的run函数里才可以吧。共同学习啊,我也刚学java
      

  10.   

    其实我的意思就是能否在A线程中把B线程给wait()了~
      

  11.   


    public class ThreadTest extends Thread {    public void run() {
            while(true){
            
                System.out.println(this.getName());
                this.pause();
            }
        }
        
        public synchronized void pause(){
            try {
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }    public static void main(String[] args) throws InterruptedException {
            ThreadTest t = new ThreadTest();
            t.start();
            
            t.pause();        
        }
    }
      

  12.   

    也就是说无法A线程中把B线程给wait()?
    wait()只能作用在执行这个方法的线程上,而非这个方法属于的那个线程?
      

  13.   

    刚学Java,高人很多啊,多学习呢
      

  14.   

    我的意思仅仅是能否在A线程中调用B线程的wait()方法,使B线程等待?
      

  15.   


    看api文档:
    wait()
              Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.wait()方法只能让当前线程阻塞,你在在A线程中调用B线程的wait()方法,结果还是A线程阻塞。
    在A线程中调用任何对象的wait()都是使A线程阻塞
      

  16.   


    B线程要阻塞,为什么要用A线程来掉呢?完全可以B线程自己调用wait嘛。