說進程之前首先說一下程序,程序是指令和數據的有序集合,本身沒有任何運行的含義,是一個靜態的概念.
進程就是程序的一次執行過程,是一個動態的概念,是系統分配資源的單位.
而一個進程由若干個線程組成,進程中至少要有一個線程,不然就沒有存在的意義,線程是CPU調度和執行的單位.是獨立的執行路徑
第一種實現:
繼承Thread類
package com.lei.thread;
//實現多線程方式一:繼承Thread類
public class Thread1 extends Thread{
//重寫run方法,編寫線程執行體
注意:線程的run()方法是由java虛擬機直接調用的,如果我們沒有調用線程的start()方法,而是在應用代碼中直接調用run()方法,那么這個線程的run()方法其實運行在當前線程(即run()方法的調用方所在的線程)之中,而不是運行在其自身的線程中,所以不會創建引得線程
如上面代碼:在main方法中執行的run()方法不會創建新的線程,而在main方法中執行的start()方法會啟動一個新的線程,新的線程再去調用run方法
第二種實現:
實現Runnable接口
package com.lei.thread;
//實現多線程方式二:實現Runnable接口
public class Thread2 implements Runnable{
//重寫run方法,編寫線程執行體
第三種實現:
實現Callable接口
Callable接口類似於Runnable,兩者都是實現接口,但是Callable的call()方法可以有返回值,並且可以拋出異常。但是Runnable不行。
另外,需要創建一個FutureTask對象用來獲取結果以及傳遞參數給線程對象
package com.lei.thread;
import java.util.concurrent.*;
//實現多線程方式三:實現Callable接口,這里的泛型是返回值的類型
public class Thread3 implements Callable<String> {
//重寫call方法,拋出異常,編寫線程執行體,
第四種實現
線程池方式
package com.lei.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Thread4 implements Runnable{