1. 程式人生 > >執行緒 之 建立(兩種方法)和啟動

執行緒 之 建立(兩種方法)和啟動

java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread 類或者子類的例項。

每個執行緒的任務是完成一定的任務,就是執行一段程式流。

目前有兩種建立方式(第三種後續補充)
一種是繼承Thread類
一種是實現Runnable介面`

一、繼承Thread類
1.定義Thread子類,並重寫run()方法。
run()方法內就是執行緒需要完成的任務,因此可以將run()方法稱為執行緒執行體。
2.建立Thread子類的例項,也就是建立執行緒物件。
3.執行緒物件呼叫start()方法,啟動執行緒。

package myclass;
//包:編譯時需要:javac -d e:\java基礎 FirstThread.java 在當前資料夾中顯示class檔案
//執行前:set classpath=e:\java基礎
//執行:java myclass.FirstThread
//定義Thread子類,用來繼承Thread類
class SecondThread extends Thread
{
private int i;
//呼叫run()方法,run()放就是執行緒的執行體。
public void run()
{
for( ;i<100;i++)
{
//當執行緒繼承Thread類後,直接使用this即可或得當前執行緒。
//Thread類物件的getName()返回當前執行緒的名字。
System.out.println(this.getName() + " " + i );
}
}
}
public class FirstThread
{
public static void main(String[] args)
{
for(int x=0;x<100;x++)
{
//呼叫Thread類的currentThread()方法來獲取當前執行緒
System.out.println(Thread.currentThread().getName()+ " " + x);
if(x == 20)
{
//建立子類的例項
SecondThread st = new SecondThread();
//啟動執行緒,執行緒只能呼叫一次start()方法,否則就會發生異常。
st.start();
}
}
}
}

其中包括兩個執行緒:
1.是程式顯式建立並啟動了一個執行緒。
會被this.getName()獲取呼叫該方法的執行緒的名字。
2.main()方法的方法體代表主執行緒的執行緒執行體。
會被Thread.currentThread().getName()方法打印出來名字

注意:1.重寫的run()方法可以作為一般方法來進行呼叫,這種呼叫不會出現執行緒。
同樣run()方法也可以被過載,過載後的的run()方法也不是執行緒。
2.這兩個迴圈變數不連續,表示他們沒有共享資料

二、實現Runnable介面建立執行緒類
1.建類實現介面
2.覆蓋Runnable介面中的run()方法,將要執行的程式碼放在run()中
3.通過Thread類建立物件
4.將Runnable介面的子類作為實參傳遞給Thread類的建構函式中
5.呼叫Thread類的start()方法開啟執行緒。

package myclass;
class ThreadDemo implements Runnable //實現介面Runnable
{
private int i;
//覆蓋介面中的run()方法,run()方法中是程式的執行體。
public void run()
{
for( ; i<100 ;i++)
{
//當執行緒實現Runnable後,就只能使用Thread.currentThread().getName()
//方法獲取當前執行緒的名字。
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

class SecondThread
{
public static void main(String[] args)
{
for(int x=0;x<100;x++)
{
System.out.println(Thread.currentThread().getName() + " " +x);
if(x == 20)
{
//建立Runnable介面的子類物件
ThreadDemo st = new ThreadDemo();
//將該子類物件作為實參傳入到Thread建構函式中
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();

       }
    }
 }

}

Runnable介面可以共享同一個執行緒類的例項變數。

Runnable 的優缺點是:
優點:
1.執行緒類實現了Runnable 類還可以繼承其他類。
2.在陣中情況下,可以共享同一個target物件,所以適合多個執行緒來處理同一份資源,從而將程式碼,資料,cup分開,形成較為清晰的模型,較好地體現了面對物件的思想
缺點:
如果需要訪問當前執行緒,只能使用Thread.currentThread()方法。

Thread的優缺點:
缺點:因為繼承了Thread類,所以不能再繼承其他類
優點:如果需要訪問當前執行緒,直接使用this.就行。