1.java線程常見的三種創(chuàng)建方式
1.1 通過繼承Thread類
package com.demo.noteBook;
public class MyThread1 extends Thread{
public MyThread1(){
}
@Override
public void run() {
System.out.println("Mythread1 test!");
}
public static void main(String[] args) throws Exception{
Thread myThread = new MyThread1();
//1.直接調(diào)用myThread.run()方法,這里體現(xiàn)的是并發(fā)特性了赌,
//只有一個線程run方法里面的代碼執(zhí)行完后才能執(zhí)行別的線程的run方法
//myThread.run();
//2.調(diào)用線程的Thread的start()的方法眉反,體現(xiàn)的是并行特性貌夕,多個線程的run方法同時執(zhí)行伍绳。
myThread.start();
}
}
優(yōu)點:直接繼承Thread類,可以直接調(diào)用Thread類里面的方法只怎。
缺點:由于java是單繼承模式袜瞬,導(dǎo)致不能繼承其他的類,可拓展性不強身堡。
1.2 實現(xiàn)Runnable接口
package com.demo.noteBook;
public class MyThread2 implements Runnable{
@Override
public void run(){
System.out.println("MyThread2 test");
}
public static void main(String[] args) throws Exception{
Thread myThread = new Thread(new MyThread2());
myThread.start();
}
}
也可以直接使用jdk1.8的lamda表達式寫匿名函數(shù)邓尤,更加簡潔直接:
package com.demo.noteBook;
public class MyThread3{
public static void main(String[] args) throws Exception{
Thread myThread3 = new Thread( () ->{ System.out.println("MyThread3 test");} );
myThread3.start();
}
}
優(yōu)點:java是多實現(xiàn)的,可拓展行強贴谎,同時使用這種方法實現(xiàn)多線程的使用汞扎。
缺點:無法直接使用Thread里面的方法,代碼比較復(fù)雜擅这。
1.3 Callable方式
package com.demo.noteBook;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class MyThread4 implements Callable{
@Override
//call 方法返回的必須是對象
public Integer call(){
int sum = 0;
for(int i= 1; i <= 100; i++)
sum += i;
return sum;
}
public static void main(String[] args) throws Exception{
ExecutorService pool = Executors.newFixedThreadPool(2);
//調(diào)用sumit方法有返回執(zhí)行結(jié)果的future對象佩捞,通過get方法獲得執(zhí)行結(jié)果
Future<Integer> f1 = pool.submit(new MyThread4());
System.out.println(f1.get());
}
}
lamda表達式重寫
package com.demo.noteBook;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MyThread5 {
public static void main(String[] args) throws Exception{
ExecutorService pool = Executors.newSingleThreadExecutor();
int result = pool.submit( () -> { int sum = 0;
for(int i= 1; i <= 100; i++)
sum += i;
return sum; } ) .get();
System.out.println("future result : " + result);
}
}
優(yōu)點:有返回值,獲取結(jié)果的get()方法是異步執(zhí)行的
缺點:需要用到線程池蕾哟,代碼比較復(fù)雜
2.并發(fā)和并行的區(qū)別
并發(fā)的關(guān)鍵是有處理多個任務(wù)的能力,不一定要同時。
并行的關(guān)鍵是有同時處理多個任務(wù)的能力谭确。
參考文章鏈接 https://blog.csdn.net/hxhaaj/article/details/81004712