創建線程的四種方式


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM