1、操作系統在執行一個程序時,會自動建立一個‘進程’,這個進程中,至少包含一個線程(這個線程被稱爲主線程),來作爲程序入口。
2、操作系統運行中,會產生很多個‘進程’,這些進程不共享內存;而每個進程佔有的內存,卻可以被這個進程中不同的‘線程’所共享;另外,這些線程不僅共享這段內存,每個線程還可有一個屬於它自己的內存空間——線程棧,這是線程建立時,操作系統分配的,用來保存線程數據。
3、線程總是屬於某個進程,進程中的多個線程共享進程的內存。
4、進程被分爲多個線程後,這些線程可以併發執行(並不是真正意義上的併發,而是線程調度造成的假象,詳情參考相關操作系統教程)。
【JAVA線程】
1、由於Java是純面嚮對象語言,因此,Java的線程模型也是面向對象的,Java通過Thread類將線程所必須的功能都封裝了起來。
2、如果想運行自己的線程執行函數,那就要覆蓋Thread類的run方法,即,繼承Thread類,重寫類裏面的run()方法,run()裏面寫你要執行的代碼。如下:
public class MyThread extends Thread
{
public void run()
{
//你的代碼
}
}
3、執行的時候,實例化MyThread,然後調用start()方法;start方法負責建立線程,調用start方法後,如果線程建立成功,會自動調用Thread類的run方法,即開始執行你的代碼。如下:
public static void main(String[] arg0)
{
MyThread myThread = new MyThread();
myThread.start();
}
4、除了Thread類,還有一個標識某個Java類是否可作爲線程類的接口Runnable,這個接口只有一個抽象方法run,也就是Java線程模型的線程執行函數。一個線程類的唯一標準就是這個類是否實現了Runnable接口的run方法,也就是說,擁有線程執行函數的類就是線程類。
5、通過繼承Thread類來建立線程,雖然在實現起來更容易,但由於Java不支持多繼承,如果這個線程類繼承了Thread,就不能再繼承其他的類了。因此,Java線程模型提供了通過實現Runnable接口的方法來建立線程,這樣線程類可以在必要的時候繼承和業務有關的類,而不是Thread類。
6、Runnable例子:
public class MyThread implements Runnable
{
public void run()
{
//your code
}
}
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
Thread t1 = new Thread(myThread1);
Thread t2 = new Thread(myThread2);
t1.start();
t2.start();
}
【Thread類的構造方法】
1、在使用Runnable接口時需要建立一個Thread實例,因此,無論是通過Thread類還是Runnable接口建立線程,都必須建立Thread類或它的子類的實例。Thread類的構造方法被重載了八次,構造方法如下:
public Thread();
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
Runnable target
實現了Runnable接口的類的實例。要注意的是Thread類也實現了Runnable接口,因此,從Thread類繼承的類的實例也可以作爲target傳入這個構造方法。
String name
線程的名子。這個名子可以在建立Thread實例後通過Thread類的setName方法設置。如果不設置線程的名子,線程就使用默認的線程名:Thread-N,N是線程建立的順序,是一個不重複的正整數。
ThreadGroup group
當前建立的線程所屬的線程組。如果不指定線程組,所有的線程都被加到一個默認的線程組中。關於線程組的細節將在後面的章節詳細討論。
long stackSize
線程棧的大小,這個值一般是CPU頁面的整數倍。如x86的頁面大小是4KB。在x86平臺下,默認的線程棧大小是12KB。
2、在調用start方法前後都可以使用setName設置線程名,但在調用start方法後使用setName修改線程名,會產生不確定性。
Reference:
http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html 李寧的極樂世界-JAVA多線程初學者指南