線程是基本的調度單位,它被包含在進程之中,是進程中的實際運做單位,它自己是不會獨立存在。一個進程至少有一個線程,進程中的多個線程共享進程的資源。java
Java中建立線程的方式有多種如繼承Thread類、實現Runnable接口、實現Callable接口以及使用線程池的方式,線程池將在後面文章中單獨介紹,這裏先介紹另外三種方式。異步
優勢:在run方法裏能夠用this獲取到當前線程。ide
缺點:因爲Java不支持多繼承,因此若是繼承了Thread類後就不能再繼承其餘類。this
public class MyThread extends Thread { /** * 線程要執行的任務 */ @Override public void run() { System.out.println("do something..."); } public static void main(String[] args) { //建立線程 MyThread myThread = new MyThread(); //啓動線程 myThread.start(); } }
優勢:實現Runnable接口後不影響繼承其餘類,以及有利於多個線程資源共享。線程
缺點:獲取當前線程須要調用Thread.currentThread()。code
public class MyThread implements Runnable { /** * 線程要執行的任務 */ @Override public void run() { System.out.println("do something..."); } public static void main(String[] args) { //建立兩個線程,並指定相同的任務 Thread thread1 = new Thread(new MyThread()); Thread thread2 = new Thread(new MyThread()); //啓動線程 thread1.start(); thread2.start(); } }
優缺點相似於實現Runnable接口,可是實現Callable接口能夠有返回值。繼承
public class MyThread implements Callable<String> { /** * 線程要執行的任務,而且具備返回值 */ @Override public String call() throws Exception { System.out.println("do something..."); Thread.sleep(3000); return "我是返回值"; } public static void main(String[] args) throws ExecutionException, InterruptedException { //建立異步任務 FutureTask<String> futureTask = new FutureTask(new MyThread()); //啓動線程 new Thread(futureTask).start(); //阻塞等待線程執行完成並返回結果 String result = futureTask.get(); System.out.println(result); } }