views:

217

answers:

3
package pkg_1;

public class ExpOnWaitMethod extends Thread {

    static Double x = new Double(20);


    public static void main(String[] args) {

        ExpOnWaitMethod T1 = new ExpOnWaitMethod();
        ExpOnWaitMethod T2 = new ExpOnWaitMethod();

        T1.start();

        T2.start();

    }

    public void run() {

        Mag mag = new Mag();

        synchronized (x) {

            try {
                for (int i = 1; i < 10; i++) {
                    mag.nop(Thread.currentThread());
                    x = i * 2.0;

                }

            } catch (InterruptedException e) {

                e.printStackTrace();
            }

        }
    }

}

class Mag {
    char ccc = 'A';

    public void nop(Thread thr) throws InterruptedException {

        System.out.print(ccc + " ");
        ccc++;

        if (thr.getState().toString().equalsIgnoreCase("runnable"))
            Thread.currentThread().wait();
        //thr.notify();
    }
}
+5  A: 

You need to hold the lock on the object you want to wait on (you can only call it within a synchronized block).

Also, calling wait on a Thread is very unusual and probably not what you want.

I am not sure what you are trying to do, but could you be confusing wait with sleep?

If you want to wait for another thread to finish, that would be anotherThread.join().

Thilo
Very unusual, right, not very usual? ;-)
Chris Jester-Young
yup. fixed. thanks.
Thilo
I agree calling wait on a thread monitor is as strange as calling a wait on a java.util.concurrent.Condition monitor :)
John V.
Thank u , I'm Just beginner in multi-threading
MineIsMine
@Thilo, we keep crossing paths. Cheerio!
andersoj
+1  A: 

Before you call wait on an object, you must acquire that object's lock:

syncrhonized(obj)
{
    obj.wait();
}

Your code is calling wait on a Thread object without acquiring the lock first.

I assume this is just a simplified test case to show your problem, but note that you probably want to be calling wait on an object that is accessible from all threads, not on the Thread objects themselves.

Grodriguez
A: 

Someone should cite the API contract for java.lang.Object.wait(), which explains this directly. If a method raises an exception, read the documentation.

When in doubt, read the contract. (Bill McNeal on NewsRadio always kept his in his jacket pocket, a good metaphor for the JavaDoc API.. see "Crazy Prepared" under NewsRadio and ponder the imponderable.)

andersoj