高并發(fā)編程-00-創(chuàng)建多線程的7種方式

1,繼承Thread

主要掌握:線程的初始化,啟動,中斷的正確處理方式(interrupted)

public class Demo1 {

????public static void main(String[] args) {

????????MyThread thread = new MyThread();

????????thread.start();

????}

}

class MyThread extends Thread{

????@Override

????public void run() {

????????System.out.println(Thread.currentThread().getName()+":running...");

????}

}

2,實現Runnable

源碼解析,為什么會調用Runnable的run方法

public class Demo2 {

????public static void main(String[] args) {

????????MyRunnable task = new MyRunnable();

????????new Thread(task).start();

????}

}

class MyRunnable implements Runnable{

????@Override

????public void run() {

????????System.out.println(Thread.currentThread().getName()+":running");

????}

}

3,匿名內部類的方式(線程只創(chuàng)建一次的情況)

有兩種方式

public class Demo3 {

????public static void main(String[] args) {

????????new Thread(){

????????????public void run() {

????????????????System.out.println("通過匿名內部類的方式來創(chuàng)建線程");

????????????};

????????}.start();

????????new Thread(new Runnable() {

????????????@Override

????????????public void run() {

????????????????System.out.println("通過實現一個匿名的Runnable子類來實現");

????????????}

? ? ? ? ?}).start();

????}

}

給大家留個思考題,如果兩種都兼顧,執(zhí)行的時候會采用哪種?為什么?

new Thread(new Runnable() {

????@Override

????public void run() {

????????System.out.println("你猜是運行這一段?");

????}

}){

????public void run() {

????????System.out.println("還是這一段?");

????};

}.start();

4,帶返回值的線程,實現Callable接口

實現call方法

FutureTask對任務進行封裝

5,使用定時器的方式

Timer,TimerTask,執(zhí)行定時任務

6,使用線程池的方式

通過Executors創(chuàng)建不同的線程池進行任務執(zhí)行

7,Lambda表達式(函數式編程)JDK1.8提供的新特

lambda表達式代碼簡潔,實現方便,對并發(fā)支持好,性能高

我們通過打印一個集合的數據來觀察運行結果,發(fā)現出來的順序是不一致的,說明是多線程方式

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容