Karmel Zaidan
Karmel Zaidan

Reputation: 173

Notify java thread from another class

I have two classes, The first one is in charge of creating threads, then those threads need to be notified from the second class

Problem: I cannot find created threads from the second class, getThreadByName() always return null, Any Idea?.

FirstClass

public class class1{
    protected void createThread(String uniqueName) throws Exception {

        Thread thread = new Thread(new OrderSessionsManager());
        thread.setName(uniqueName);
        thread.start();

    }
}

OrderSessionManager

public class OrderSessionsManager implements Runnable {

public OrderSessionsManager() {

}

@Override
public void run() {
    try {
        wait();
    }catch(Exception e) {
        e.printStackTrace();
    }

}

SecondClass

public class class2{
    protected void notifyThread(String uniqueName) throws Exception {

        Thread thread = Utils.getThreadByName(uniqueName);
        thread.notify();

    }
}

Utils

public class Utils{
    public static Thread getThreadByName(String threadName) {

        ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] threads = new Thread[noThreads];
        currentGroup.enumerate(threads);
        List<String>names = new ArrayList<String>();

        for (Thread t : threads) {
            String tName = t.getName().toString();
            names.add(tName);
            if (tName.equals(threadName)) return t;
        }
    return null;
    }
}

Upvotes: 0

Views: 1238

Answers (1)

user10527814
user10527814

Reputation:

There are several issues with your code:

1) It breaks Java Code Conventions: class name must start with a capital letter

2) wait() method must be called by a thread who owns the object's monitor so you must use something like:

 synchronized (this) {   
             wait(); 
     }

3) notify() method must be called by a thread who owns the object's monitor and by the same object as wait(), in your case OrderSessionsManager's instance.

4) Since you do not specify a ThreadGroup, the thread gets it's ThreadGroup from it's parent. The following code works as expected:

public class Main {
    public static void main(String[] args) {
        class1 c1 = new class1();
        try {
            c1.createThread("t1");
        } catch (Exception e) {
            e.printStackTrace();
        }
         Thread thread = Utils.getThreadByName("t1");
         System.out.println("Thread name " + thread.getName());
    }
}

but this happens only because the t1 thread is in the same group as the main thread.

Upvotes: 2

Related Questions