1. 程式人生 > 其它 >java建立執行緒的四種方式

java建立執行緒的四種方式

執行緒的建立和啟動


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();

優點

  • 方便快捷

缺點

  • 複用性低