一、繼承Thread類
繼承Thread類創建線程的步驟為:
(1)創建一個類繼承Thread類,重寫run()方法,將所要完成的任務代碼寫進run()方法中;
(2)創建Thread類的子類的對象;
(3)調用該對象的start()方法,該start()方法表示先開啟線程,然后調用run()方法;
public class Thread1 { public static void main(String[] args) { Thread.currentThread().setName("主線程"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //創建一個新線程 ThreadDemo1 thread1 = new ThreadDemo1(); //為線程設置名稱 thread1.setName("線程一"); //開啟線程 thread1.start(); } } class ThreadDemo1 extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } }
二、實現Runnable接口
實現Runnable接口創建線程的步驟為:
(1)創建一個類並實現Runnable接口
(2)重寫run()方法,將所要完成的任務代碼寫進run()方法中
(3)創建實現Runnable接口的類的對象,將該對象當做Thread類的構造方法中的參數傳進去
(4)使用Thread類的構造方法創建一個對象,並調用start()方法即可運行該線程
public class Thread2 { public static void main(String[] args) { Thread.currentThread().setName("主線程"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //創建一個新線程 Thread thread2 = new Thread(new ThreadDemo2()); //為線程設置名稱 thread2.setName("線程二"); //開啟線程 thread2.start(); } } class ThreadDemo2 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } }
三、實現Callable接口
實現Callable接口創建線程的步驟為:
(1)創建一個類並實現Callable接口
(2)重寫call()方法,將所要完成的任務的代碼寫進call()方法中,需要注意的是call()方法有返回值,並且可以拋出異常
(3)如果想要獲取運行該線程后的返回值,需要創建Future接口的實現類的對象,即FutureTask類的對象,調用該對象的get()方法可獲取call()方法的返回值
(4)使用Thread類的有參構造器創建對象,將FutureTask類的對象當做參數傳進去,然后調用start()方法開啟並運行該線程。
public class Thread3 { public static void main(String[] args) throws Exception { Thread.currentThread().setName("主線程"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //創建FutureTask的對象 FutureTask<String> task = new FutureTask<String>(new ThreadDemo3()); //創建Thread類的對象 Thread thread3 = new Thread(task); thread3.setName("線程三"); //開啟線程 thread3.start(); //獲取call()方法的返回值,即線程運行結束后的返回值 String result = task.get(); System.out.println(result); } } class ThreadDemo3 implements Callable<String> { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); return Thread.currentThread().getName()+":"+"返回的結果"; } }
四、使用線程池創建
使用線程池創建線程的步驟:
(1)使用Executors類中的newFixedThreadPool(int num)方法創建一個線程數量為num的線程池
(2)調用線程池中的execute()方法執行由實現Runnable接口創建的線程;調用submit()方法執行由實現Callable接口創建的線程
(3)調用線程池中的shutdown()方法關閉線程池
public class Thread4 { public static void main(String[] args) throws Exception { Thread.currentThread().setName("主線程"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //通過線程池工廠創建線程數量為2的線程池 ExecutorService service = Executors.newFixedThreadPool(2); //執行線程,execute()適用於實現Runnable接口創建的線程 service.execute(new ThreadDemo4()); service.execute(new ThreadDemo6()); service.execute(new ThreadDemo7()); //submit()適用於實現Callable接口創建的線程 Future<String> task = service.submit(new ThreadDemo5()); //獲取call()方法的返回值 String result = task.get(); System.out.println(result); //關閉線程池 service.shutdown(); } } //實現Runnable接口 class ThreadDemo4 implements Runnable{ @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } } //實現Callable接口 class ThreadDemo5 implements Callable<String>{ @Override public String call() throws Exception { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); return Thread.currentThread().getName()+":"+"返回的結果"; } } //實現Runnable接口 class ThreadDemo6 implements Runnable{ @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } } //實現Runnable接口 class ThreadDemo7 implements Runnable{ @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } }