高併發程式設計-00-建立多執行緒的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,匿名內部類的方式(執行緒只建立一次的情況)
有兩種方式
public class Demo3 {
public static void main(String[] args) {
new Thread(){
public void run() {
System.out.println("通過匿名內部類的方式來建立執行緒");
};
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("通過實現一個匿名的Runnable子類來實現");
}
}).start();
}
}
給大家留個思考題,如果兩種都兼顧,執行的時候會採用哪種?為什麼?
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,執行定時任務
6,使用執行緒池的方式
通過Executors建立不同的執行緒池進行任務執行
7,Lambda表示式(函數語言程式設計)JDK1.8提供的新特
lambda表示式程式碼簡潔,實現方便,對併發支援好,效能高
我們通過列印一個集合的資料來觀察執行結果,發現出來的順序是不一致的,說明是多執行緒方式