humkins
humkins

Reputation: 10695

How to control threads liveness in Java?

There are two or more threads: main and several children. Children are workers, main controls children liveness. Once main thread detects a child thread is dead it creates new thread.

Currently I can't imagine better solution than checking t.isAlive() on each thread in a loop but it is well known that developers should avoid polling at any cost.

Note. Worker thread can wait several minutes on HTTP response (getInputStream() on URLConnection)

UPDATE

Worker doesn't finish its job but after it received a response or on timeout it creates new connection and awaiting for server response again.

Upvotes: 0

Views: 616

Answers (3)

Solomon Slow
Solomon Slow

Reputation: 27190

Andremoniy: if you want to recreate thread with same functionallity, why do you allow threads to die?

gumkins: For example I can't fix uncaught exceptions in third-party code.

If it doesn't make sense to catch the exception, and continue running in the same thread, then it won't make any sense to start a new thread to take the old thread's place. Starting a new thread accomplishes nothing.

All threads share the same heap and the same global state. If the library keeps global state in static variables or singleton objects, then that same state will be visible in every thread. If the global state is broken/invalid after some exception, then it's going to be invalid/broken in every thread. (And that includes any new threads that your program creates after the damage was done.)


Incidentally, the wheel that you are trying to re-invent here has a name: It's called a "thread pool."

The Java standard library provides a number of different kinds of thread pool which all implement the java.util.concurrent.ExecutorService interface. You should check it out.

Upvotes: 0

Ozgen
Ozgen

Reputation: 1092

You shouldn't use low level Thread methods if you don't really need them. Instead, use Java Concurrency API. For your case, I would use a thread pool which controls the threads. If a thread finishes its job, it returns to the pool rather than really dying.

Upvotes: 1

Andremoniy
Andremoniy

Reputation: 34900

According to the purposes in your question and our "dialog" in comments, I suggest you following simple idea.

if you want to recreate thread with same functionallity, why do you allow threads to die?

If you have, as you said, 3-d party threads implementation, you can wrap them into another thread and do not allow them to die.

Consider, 3-d party Thread implementation is called ThirdPartyThread class. So, instead of checking their state with .isAlive(), just wrap it into another thread with try ... catch:

new Thread(new Runnable() {
  @Override
  public void run() {
      do {
        try {
           new ThirdPartyThread().run();
        } catch (Throwable t) {
           // you can vary behaviour here with different classes of exceptions.
           // But main idea is to catch their death and go on
        }
      } while (true); // instead of `true` you can use your specific condition
   }
}).start();

Upvotes: 0

Related Questions