java建立執行緒的四種方式
阿新 • • 發佈:2021-11-03
執行緒的建立和啟動
1.繼承Thread來建立執行緒
public class Demo extends Thread
{
private xx;
public void run()
{
//這個執行緒要執行的東西
.......
}
public static void main(String []__)
{
Demo th=new Demo();
th.start();
}
}
這樣就算是建立了一個執行緒
兩個方法介紹
- Thread中的currentThread(),返回當前正在執行的執行緒
- getName(),返回執行緒名字
- 建立的時候,傳遞進去string型別的引數當做執行緒名字
2.實現Runnable類來作為引數傳遞
class A extends Runnable { private int age;//共同的field public void run() { .... } public static void main(String[]__) { A paremeter = new A(); Thread test=new Thread(paremeter); test.start(); Thread other=new Thread(paremeter); other.start(); //如果我們的run裡面對於共享的變數age做出了修改,其實這兩個執行緒中,field是相同的,可能會造成共享的資料出現訪問衝突,可以考慮使用volatile關鍵字 } }
3.使用Callable和Future來建立執行緒(jdk1.5加入)
步驟如下:
- 建立callable介面的實現類,並且實現call()方法,這個call()方法將作為執行緒的執行體
- 建立實現類的例項,使用Futuretask類來保證Callable物件,這個FutureTask物件封裝了該Callable物件call方法的返回值,也就是執行緒的執行體可以有返回值了
- 將FutureTask物件作為thread的target,建立並且啟動執行緒。
- 使用 FutureTask物件的get方法獲得子執行緒執行結束之後返回的數值
package thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CallableDemo implements Callable<Integer> { @Override public Integer call() throws Exception { int i=0; for(;i<99;i++) { System.out.println(i+" "+Thread.currentThread().getName()); } return i; } public static void main(String[]__) { //建立callable物件 CallableDemo rt=new CallableDemo(); //把callable繫結到FutureTask物件上面 FutureTask<Integer> task=new FutureTask<>(rt); //把任務加入thread的target中去 new Thread(task).start(); try { System.out.println(task.isDone()+" "+task.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } new Thread(task).start(); try { System.out.println(task.isDone()+" "+task.get()); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } //他們的field也是隻有一塊,一個執行緒跑完會修改field中的數值 } }
優點:
- 具有返回值
- 可以丟擲異常
缺點:
- 使用get方法得到返回值可能丟擲異常,執行緒可能沒有執行完畢
- get()方法會阻塞主執行緒,直到all方法返回
4.匿名方式建立執行緒(與Runnable同)
new Thread(new Runnable() {
private int i=0;
@Override
public void run() {
System.out.println(i);
}
},String.valueOf("1")).start();
優點:
- 方便快捷
缺點:
- 複用性低