Java Programming - Threads - Discussion

17. 

What will be the output of the program?

public class Test 
{
    public static void main (String [] args) 
    {
        final Foo f = new Foo();
        Thread t = new Thread(new Runnable() 
        {
            public void run() 
            {
                f.doStuff();
            }
        });
        Thread g = new Thread() 
        {
            public void run() 
            {
                f.doStuff();
            }
        };
        t.start();
        g.start();
    }
}
class Foo 
{
    int x = 5;
    public void doStuff() 
    {
        if (x < 10) 
        {
            // nothing to do
            try 
            {
                wait();
                } catch(InterruptedException ex) { }
        } 
        else 
        {
            System.out.println("x is " + x++);
            if (x >= 10) 
            {
                notify();
            }
        }
    }
}

[A]. The code will not compile because of an error on notify(); of class Foo.
[B]. The code will not compile because of some other error in class Test.
[C]. An exception occurs at runtime.
[D]. It prints "x is 5 x is 6".

Answer: Option C

Explanation:

C is correct because the thread does not own the lock of the object it invokes wait() on. If the method were synchronized, the code would run without exception.

A, B are incorrect because the code compiles without errors.

D is incorrect because the exception is thrown before there is any output.


Akk said: (Jul 30, 2013)  
What if the method is synchronized? what will be the output then?

Both threads would be waiting right?

Priya said: (Aug 11, 2014)  
The program is not running anyway because of the FOO class. Compile time error.

Karan Asthana said: (Aug 30, 2016)  
Shouldn't we either extend Thread class or implement Runnable interface to make the code errorfree?

Tarun said: (Sep 1, 2017)  
I guess there's an error with thread in "Test" class because if you observer carefully you can find ")" is somewhere at the end for the following line:

Thread t = new Thread(new Runnable()

i.e., at the end of that definition.

Am I correct?

Post your comments here:

Name *:

Email   : (optional)

» Your comments will be displayed only after manual approval.