Are J1, J2 and J4 also threads? You could pass them into your other jobs and use Thread.join() to wait for them to complete. For example the first 3 threads:
Thread j1 = new Job1Thread();
Thread j2 = new Job2Thread();
Thread j3 = new Job3Thread(j1, j2);
// start them up, etc.
public class Job3Thread extends Thread {
private final Thread j1;
private final Thread j2;
public Job3Thread(Thread j1, Thread j2) {
this.j1 = j1;
this.j2 = j2;
}
public void run() {
try {
j1.join();
j2.join();
// now start processing
} catch (InterruptedException ie) {
}
}
}