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

優點

  • 方便快捷

缺點

  • 復用性低


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM