一、繼承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()+":"+"輸出的結果");
}
}
