進程:作一個簡單的解釋,你的硬盤上有一個簡單的程序,這個程序叫QQ.exe,這是一個程序,這個程序是靜態的概念,它被仍在硬盤上也沒人理它,可是當你雙擊它,彈出一個界面輸入帳號密碼登陸進去了,OK,這個時候叫作一個進程。進程相對於程序來講它是一個動態的概念。java
線程:一個進程中最小的執行單元就叫一個線程,簡單來說就是一個程序裏不一樣的執行路徑叫作一個線程。ide
import java.util.Scanner; import java.util.concurrent.*; /** * @ClassName Test * @Description TODO * @Author liuyi * @Date 2020/5/16 12:21 * @Version 1.0 */ public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { //啓動線程的5種方式 //1,new一個繼承了Thread的類 new MyThread().start(); //2,實現Runnable接口,匿名內部類的方式,並採用了靜態代理的方式 new Thread(new Runnable() { @Override public void run() { System.out.println("經過實現Runnable接口建立線程"); } }).start(); //3,lambda表達式建立,其實只是將第二種方式換了個寫法 //這裏爲何能夠用lambda表達式,是由於Runnable是一個函數式接口 //函數式接口就是用有且只有一個方法的接口(一般用@FunctionalInterface註解),因此能夠將方法名稱省略 new Thread(()-> System.out.println("經過lambda表達式建立線程")).start(); //4,使用FutureTask+Callable建立(當須要獲取線程返回值的時候須要經過這種方式進行建立) FutureTask futureTask = new FutureTask(new MyTask()); new Thread(futureTask).start(); //futureTask.get()方法會一直阻礙,直到獲取到結果,程序纔會繼續執行 System.out.println(futureTask.get()); //5,經過線程池的方式建立 ExecutorService service = Executors.newCachedThreadPool(); service.execute(()-> System.out.println("經過線程池的方式建立線程")); service.shutdown(); } } class MyThread extends Thread{ public void run(){ System.out.println("經過繼承Thread類並重寫run方法建立線程"); } } class MyTask implements Callable { public MyTask() { } //構造函數,用來向task中傳遞任務的參數 //任務執行的動做 @Override public String call() throws Exception { System.out.println("經過FutureTask+Callable建立線程"); Thread.sleep(1000); return "我是這次線程的返回值"; } }