java建立線程的三種方式(學習筆記)

參考書:瘋狂java講義,java程序設計基礎。java

1新建狀態(newborn)當一個Thread類或者其子類的對象被聲明或者是建立,但沒有執行的這段狀態稱爲新建狀態。dom

2.就緒狀態(runnable)就緒狀態也稱爲可運行狀態。處於新建狀態的線程被啓動後,將進入線程列隊排隊等候cpu的調度,此時具有了運行的條件,也就是就緒狀態。學習

3.運行狀態(Runing)就緒狀態的線程得到cpu的調度並得到系統資源後便進入了運行狀態。線程

處於運行狀態的線程在一下狀況下將讓出cpu的控制權設計

●線程運行完畢。code

●有比當前優先級更高的線程處於就緒狀態。對象

●線程主動睡眠一段時間。繼承

●線程正在等待某一資源。接口

4.阻塞狀態(blocked)一個運行的線程在某些特殊的狀況下將讓出cpu,並暫時停止本身的執行。線程處於這種不可運行的狀態稱爲阻塞狀態。下面幾種狀況下可使一個線程進入阻塞狀態。隊列

●調用sleep()或者yield()方法。

●等待一個條件變量線程調用wait()方法。

●該線程與另外一個線程join()在一塊兒。

一個線程被阻塞時不能進入排隊隊列,阻塞的緣由被消除時才能進入就緒狀態。阻塞狀態的線程一般須要某些事件才能喚醒,睡眠狀態的線程必須阻塞一段固定時間。

5.消亡狀態(dead)處於消亡狀態的線程不具有繼續執行的能力,致使線程消亡的緣由有兩個:一是執行了run()方法的最後一條語句,二是進程中的線程被強制終止。

線程的調度與優先級:java語言支持搶佔調度模型,每一個線程都被賦予一個執行的優先級。從1到10整數型。Thread類有三個優先級的靜態變量MIN_PRIORITY(1),MAX_PRIORITY(10),NORM_PRIORITY(5)。

建立線程:

經過繼承Thread類來建立線程的步驟以下。

1.定義Thread類的子類並重寫該類的run方法。該run()方法體稱爲線程執行體。

2.建立Thread類的子類實列,即建立線程對象。

3.調用線程對象的start()方法。

package Test;
class MyThread extends Thread
{
	private String who;
	public MyThread(String str)
	{
		who=str;
	}
	public void run()
	{
		for(int i=0;i<5;i++)
		{
			try
			{
				sleep((int)(1000*Math.random()));
			}
			catch(InterruptedException e)
			{
				
			}
			System.out.println(who+"正在運行");
		}
	}
}
public class App11_1 {
	public static void main(String[] args)
	{
		MyThread you=new MyThread("你");
		MyThread she=new MyThread("她");
		you.start();
		she.start();
		System.out.println("主方法main運行結束");
		
	}
}

主方法main運行結束
她正在運行
你正在運行
她正在運行
你正在運行
她正在運行
你正在運行
你正在運行
你正在運行
她正在運行
她正在運行
--------------------------------------------------------

實現Runnable藉口建立線程:

●定義Runnable藉口實現類,並重寫Run方法,該Run()方法一樣是線程的執行體。

●建立藉口實現類的實例,並以實例做爲Thread類的參數。該Thread對象纔是真正的線程對象。

package Test;
class MyThread_ implements Runnable
{
	private String who;
	public MyThread_(String str)
	{
		who=str;
	}
	public void run()
	{
		for(int i=0;i<5;i++)
		{
			try
			{
				Thread.sleep((int)(Math.random()*1000));//注意sleep方法是Thread類的
			}
			catch(InterruptedException e)
			{
				
			}
			System.out.println(who+"正在運行");
		}
	}
}
public class App11_2 {
	public static void main(String[] args)
	{
		MyThread_ you=new MyThread_ ("你");
		MyThread_ she=new MyThread_("她");
		Thread a=new Thread(you);
		Thread b=new Thread(she);
		a.start();
		b.start();
		System.out.println("Main方法執行完畢");
	}

}

使用callable和Future建立線程。

建立並啓動有返回值的線程步驟以下。

1.建立callable接口實現類,並實現call()方法,該call()方法將作線程的執行體,且該call()方法有返回值。

2.建立Callable實現類的實列,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝該Callable對象的call()方法的返回值。

3.使用FutureTask對象做爲Thread對象參數建立並啓動線程。

4.調用FutureTask對象的get()方法來得到子線程執行結束後的返回值。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;


public class ThirdThread implements Callable<Integer> {
//實現call()方法,實現線程執行體
	public Integer call()
	{
		int i=0;
		for( ;i<100; i++)
		{
			System.out.println(Thread.currentThread().getName()+"的循環變量i的值:"+i);
			
	
		}
		return i;
	}
	public static void main(String[] args)
	{
		ThirdThread rt=new ThirdThread();
		//使用FutureTask類來包裝Callable對象。
		FutureTask<Integer> task= new FutureTask<Integer>(rt);
		for(int i=0;i<100;i++)
		{
			System.out.println(Thread.currentThread().getName()+"的循環變量i的值:"+i);
			if(i==20)
			{	//實際仍是以Callable來建立對象。並啓動線程。
				new Thread(task,"有返回值的線程").start();
			}
			try
			{
				System.out.println("子線程的返回值:"+task.get());
			}
			catch(Exception e)
			{
				
			}
		}
	}

}

學習筆記,若有錯誤歡迎指正

相關文章
相關標籤/搜索