我想将当前线程挂起 是用wait()吗?可是为何总报错?
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
还有如何唤醒已经挂起的线程?
高手能给个详细的例子吗?
谢谢

解决方案 »

  1.   

    class Producer implements Runnable                    //缓冲区内容生产者
    {
    Q q;
    public Producer(Q q)
    {
    this.q = q;
    }

    public void run()
    {
    int  i = 0;
    while(true)
    {  
    synchronized(q) //和消费者同步
    {
    if (q.full)
    {
    try {q.wait();}catch(Exception e){}
    }
    if (i == 0)

    q.name = "zhangsan";
    q.sex = "male";
    }
    else
    {  
    q.name = "lisi";
    q.sex = "female";
    }
    q.full = true;
    q.notify();
    }
    i = (i+1) % 2;
    }
    }
    }class Consumer implements Runnable
    {
    Q q;
    public Consumer(Q q)
    {
    this.q = q;
    }
    public void run()
    {
    while(true)
    {
    synchronized(q)
    {
    if (!q.full)
    {
    try {q.wait();}catch(Exception e){}
    }
    System.out.print(q.name);
    System.out.println(" " + q.sex);
    q.full = false;
    q.notify();             //wait notify语句必须放在synchronized中
    }
    }
    }
    }class Q
    {
    public String name = "unknown";
    public String sex = "unknown";
    public boolean full = false;
    }class Threadcommunation
    {
    public static void main(String [] args)
    {
    Q q = new Q();
    new Thread(new Producer(q)).start();     //传的都是一个q,所以synchronized(q)
    new Thread(new Consumer(q)).start();
    }
    }
      

  2.   

    你出的问题是因为没有把wait notify语句放在synchronized块或方法中.
      

  3.   

    storm_zone() 您能大体讲下这段程序吗?不好意思 因为我线程方面涉及的不深 谢谢
      

  4.   

    有个缓冲区(Q类)用来装内容, 有2个线程, 一个往缓冲区里存内容, 令一个从缓冲区里取内容.
    这个同步实现了:存一次内容后取一次内容, 如果缓冲区里没内容, 取内容的线程就wait()如果缓冲区里的内容还没有被取出来,存内容的线程就wait()总之就是1存1取.要是没接触过就找本书系统的看下, 毕竟多线程是JAVA里的一大块,想学精了不容易 呵呵~
    我也是初学