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ā)現出來的順序是不一致的,說明是多線程方式
