thread.join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 再执行join()方法后面的代码
下面是一个简单版的例子,通过继承Thread 实现同步和异步多线程
同步
/** * 同步 */ public class SynThread extends Thread { private int num; public SynThread(int num) { this.num = num; } @Override public void run() { //保证同步,因为使用了thread.sleep,所以必须对整个thread类加锁,否则的话只需对将run()方法改为 public synchronized void run() synchronized (SynThread.class) { System.out.println("syn thread:" + num + " start"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("syn thread:" + num + " end"); } } }
异步
/** * 异步 */ public class AsynThread extends Thread{ private int num; public AsynThread(int num){ this.num=num; } @Override public void run() { System.out.println("asyn thread:" + num+" start"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("asyn thread:" + num+" end"); } }
同步和异步多线程
import java.util.ArrayList; import java.util.List; public class MultiThreadDemo { public static void testMultiSynThread(int num){ System.out.println("等待子线程完成:"); List<SynThread> threadList = new ArrayList<SynThread>(); for (int i = 1; i < num; i++) { SynThread thread = new SynThread(i); threadList.add(thread); thread.start(); } //使用thread.join()等待子线程完成 for (SynThread thread : threadList) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void testMultiAsynThread(int num){ System.out.println("等待子线程完成:"); List<AsynThread> threadList = new ArrayList<AsynThread>(); for (int i = 1; i < num; i++) { AsynThread thread = new AsynThread(i); threadList.add(thread); thread.start(); } //使用thread.join()等待子线程完成 for (AsynThread thread : threadList) { try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { System.out.println("同步多线程开始:"); long start=System.currentTimeMillis(); testMultiSynThread(1000); long end=System.currentTimeMillis(); System.out.println("cost time:"+(end-start)); System.out.println("异步多线程开始:"); start=System.currentTimeMillis(); testMultiAsynThread(1000); end=System.currentTimeMillis(); System.out.println("cost time:"+(end-start)); } }
最后跑了下有10个线程的时候,同步和异步花费的时间,当然每次跑的结果都不一样,但是异步比同步快,因为同步多线程中必须一个线程的run中的代码执行完后才能执行下一个线程
syn cost time:9005
asyn cost time:1005