试想一个情景,有两个线程同时工作,还有主线程,一个线程负责初始化网络,一个线程负责初始化资源,然后需要两个线程都执行完毕后,才能执行主线程
首先创建一个初始化资源的线程
public class DataSourcesLoader implements Runnable { /** * Main method of the class */ @Override public void run() { // Writes a messsage System.out.printf("Begining data sources loading: %s ",new Date()); // Sleeps four seconds try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } // Writes a message System.out.printf("Data sources loading has finished: %s ",new Date()); } }
然后创建一个初始化网络的线程
public class NetworkConnectionsLoader implements Runnable { /** * Main method of the class */ @Override public void run() { // Writes a message System.out.printf("Begining network connections loading: %s ",new Date()); // Sleep six seconds try { TimeUnit.SECONDS.sleep(6); } catch (InterruptedException e) { e.printStackTrace(); } // Writes a message System.out.printf("Network connections loading has finished: %s ",new Date()); } }
通过TimeUnit.SECONDS.sleep()方法; 进行休眠,
然后主线程执行,通过join方法,当一个线程对象的join方法被调用时,调用他的线程将会被挂起,知道这个线程来完成这些初始化任务,我们在主线程分别调用两个Thread的join方法,那么主线程会等到两个线程都执行完毕才会执行下去。
public class Main { /** * Main method of the class. Create and star two initialization tasks * and wait for their finish * @param args */ public static void main(String[] args) { // Creates and starts a DataSourceLoader runnable object DataSourcesLoader dsLoader = new DataSourcesLoader(); Thread thread1 = new Thread(dsLoader,"DataSourceThread"); thread1.start(); // Creates and starts a NetworkConnectionsLoader runnable object NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader(); Thread thread2 = new Thread(ncLoader,"NetworkConnectionLoader"); thread2.start(); // Wait for the finalization of the two threads try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } // Waits a message System.out.printf("Main: Configuration has been loaded: %s ",new Date()); } }