Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interview: How to ensure that a thread runs after another?

Tags:

There are thread T1, T2 and T3, how can we ensure that thread T2 run after T1 and thread T3 run after T2?

This question was asked in my interview. I didn't answer. Please explain in detail.

like image 248
Ashok Avatar asked Jul 18 '12 15:07

Ashok


People also ask

How do I make sure threads run in order?

You can run them all at once, but the important thing is to get their results in order when the threads finish their computation. Either Thread#join() them in the order in which you want to get their results, or just Thread#join() them all and then iterate through them to get their results.

How will you ensure that a thread will be killed after performing its operation?

Modern ways to suspend/stop a thread are by using a boolean flag and Thread. interrupt() method. Using a boolean flag: We can define a boolean variable which is used for stopping/killing threads say 'exit'. Whenever we want to stop a thread, the 'exit' variable will be set to true.

Which makes one thread to wait for another?

wait() causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0).

How Stop main thread while another thread is running?

You can not stop the main thread while any other thread are running. (All the child threads born out of main thread.) You can use function Thread. join() to keep the main thread waiting while other thread(s) execute.


3 Answers

This would be the simplest, dumbest approach:

final Thread t1 = new Thread(new T1()); // assume T1 is a Runnable
t1.start();
t1.join();
final Thread t2 = new Thread(new T2());
t2.start();
t2.join();
final Thread t3 = new Thread(new T3());
t3.start();
t3.join();
like image 108
Marko Topolnik Avatar answered Oct 14 '22 17:10

Marko Topolnik


The obvious, and simplest, way has already been posted by @Assylias - have T1 run method create/start T2 and T2 run method create/start T3.

It is, IMHO, verging on pointless, but it could be done.

Solutions using Join() do not answer the question - they ensure that the termination of the threads is ordered, not the running of them. If the interviewr does not get that, you need to find another job anyway.

In an interview, my answer would be 'For * sake why? Threads are ususally used to avoid exactly what you are asking!'.

like image 43
Martin James Avatar answered Oct 14 '22 17:10

Martin James


One way to do it would be something like the following. It's complex though. You might want to use the java.util.concurrent.CyclicBarrier class for this.

Each thread when it finishes sets the boolean value and notifies the next thread to continue. Even though it is an AtomicBoolean class, we need the synchronized so we can wait() and notify() on it.

It would be cleaner to pass in the lock objects or maybe have a begin() method on T2 and T3 so we can hide the locks inside of those objects.

final Object lock2 = new Object();
final Object lock3 = new Object();
boolean ready2;
boolean ready3;
...
public T1 implements Runnable {
    public void run() {
        ...
        synchronized (lock2) {
            // notify the T2 class that it should start
            ready2 = true;
            lock2.notify();
        }
    }
}
...

public T2 implements Runnable {
    public void run() {
        // the while loop takes care of errant signals
        synchronized (lock2) {
            while (!ready2) {
                lock2.wait();
            }
        }
        ...
        // notify the T3 class that it should start
        synchronized (lock3) {
            ready3 = true;
            lock3.notify();
        }
    }
}
...
public T3 implements Runnable {
    public void run() {
        // the while loop takes care of errant signals
        synchronized (lock3) {
            while (!ready3) {
                lock3.wait();
            }
        }
        ...
    }
}
like image 20
Gray Avatar answered Oct 14 '22 17:10

Gray