File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Threads and Synchronization and the fly likes Deadlock with Java Threads Big Moose Saloon
  Search | Java FAQ | Recent Topics
Register / Login


Win a copy of The Mikado Method this week in the Agile and other Processes forum!
JavaRanch » Java Forums » Java » Threads and Synchronization
Reply Bookmark "Deadlock with Java Threads" Watch "Deadlock with Java Threads" New topic
Author

Deadlock with Java Threads

sai praveen anumukonda
Greenhorn

Joined: Feb 17, 2010
Posts: 1
I have 2 threads. One thread prints odd numbers and the second thread prints even numbers. Now, I have to execute the threads alternatively so that i can output 1,2,3,4,5,6,.....

I have written a program for this and this is resulting in a deadlock. The output is also not desired. When i run the program i get 1 2 4 3 5 6 8 7 9 10 11 13 12 15 17 14....

Can someone explain what is the problem with the code and how to rectify it?

class BooleanObject {
boolean flag;
BooleanObject(boolean flag) {
this.flag = flag;
}
}
class EvenThread extends Thread {
Object lock;
BooleanObject flagObj;
EvenThread(Object o, BooleanObject flag) {
lock = o;
this.flagObj = flag;
}
public void run() {
for (int i=2;i<100;i+=2) {
synchronized(lock) {
if (flagObj.flag == false) {
flagObj.flag = true;
lock.notify();
}
else {
try {
while (flagObj.flag == true) {
lock.wait();
}
}
catch (InterruptedException e) {

}
}
System.out.println(i);
}
}
}
}

class OddThread extends Thread {
Object lock;
BooleanObject flagObj;
OddThread(Object o, BooleanObject flag) {
lock = o;
this.flagObj = flag;
}
public void run() {
for (int i=1;i<100;i+=2) {
synchronized(lock) {
if (flagObj.flag == true) {
flagObj.flag = false;
lock.notify();
}

else {
try {
while(flagObj.flag == false) {
lock.wait();
}
}
catch (InterruptedException e) {

}
}
System.out.println(i);
}
}
}
}

public class EvenOddThreads {
public static void main(String[] args) {
Object obj = new Object();
BooleanObject flagObj = new BooleanObject(true);
EvenThread et = new EvenThread(obj,flagObj);
OddThread ot = new OddThread(obj,flagObj);

et.setName("even thread");
ot.setName("odd thread");

et.start();
ot.start();
}
}
Henry Wong
author
Sheriff

Joined: Sep 28, 2004
Posts: 16695
    
  19


Please use code tags -- your code is not readable without formatting.

Henry


Books: Java Threads, 3rd Edition, Jini in a Nutshell, and Java Gems (contributor)
Henry Wong
author
Sheriff

Joined: Sep 28, 2004
Posts: 16695
    
  19


I can see at least two issues....

First, there are cases where you release the thread (but not in the wait() method). If a notification is sent during this time, the notification will be lost -- and presumingly is the cause of your "deadlock".

Second, you set the flag and sent the notification before you print the result. This means, it is possible for the other thread to see the changed flag (without even doing a wait) and print the next number.

Henry
 
I agree. Here's the link: http://zeroturnaround.com/jrebel - it saves me about five hours per week
 
subject: Deadlock with Java Threads
 
Similar Threads
I want to execution of a Threads in sequence
Thread Communication using wait() and notify()
final void notifyall():Wakes up all threads that are waiting for this objects lock.
Test Question about Threads
Thread.State.NEW