建立線程的幾種方式

線程和進程的區別:

  進程:作一個簡單的解釋,你的硬盤上有一個簡單的程序,這個程序叫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 "我是這次線程的返回值";
    }
}  
相關文章
相關標籤/搜索