一,什麼是線程?
線程(thread)是"進程"中某個單一順序的控制流。也被稱爲輕量級進程。是程序執行流的最小單元,每個程序都至少有一個線程,如果程序只有一個線程,那麼該線程就是程序本身。
二,線程與線程,線程與進程之間的關係:
一個進程可以包含多個線程,一個線程也可以創建或者撤銷另一個線程,同一進程中的多個線程可以併發執行,線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器爲其執行上下文。
三,多線程的作用:
多線程主要是爲了節約CPU時間,發揮利用,根據具體情況而定。通常都是把進程作爲分配資源的基本單位,而把線程作爲獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間併發執行的程度,從而顯著提高系統資源的利用率和吞吐量。
通過上面的描述相信大家對於線程已經有了初步的瞭解,下面就來用java代碼實際演練,首先,多個線程之間怎麼判斷執行的先後順序呢?除了默認的執行順序之外,每一個線程其實都是可以通過設置優先級來控制線程的先後的先後執行的。Java的Thread裏面有一個setPriority的方法,範圍爲1到10,默認值是5,數值越大優先級越高。
我們平時所寫的程序如果沒有新創建線程則一般都是單線程的,那麼怎麼寫一個多線程的程序並判斷它是不是同步執行多個方法的呢?看如下示例(泡茶程序):
publicclass Paocha extends Thread{
//燒水
publicvoid shaoshui(){
try{
//燒5秒鐘的水
System.out.println("開始燒水...");
Thread.sleep(5000);
System.out.println("燒水完成...");
}catch(Exception e){
e.printStackTrace();
}
}
//洗杯子
publicvoid wash(){
try{
for(int i=1;i<=10;i++){
System.out.println("洗第"+i+"個杯子");
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
publicvoid run(){
shaoshui();
wash();
}
}
如果我們直接讓這個線程啓動,那麼它肯定還是按單一方法的順序執行的,另外要注意的是,我們要讓一個線程啓動應該是直接使線程start(),線程此時會自動執行它的run()方法,而不是簡單的調用它的run()方法,不然這樣也無法實現線程同步,如下修改的示例:publicclass Paocha extends Thread{
String doSomething="";
public Paocha(String doSomething){
this.doSomething=doSomething;
}
//燒水
publicvoid shaoshui(){
try{
//燒5秒鐘的水
System.out.println("開始燒水...");
Thread.sleep(5000);
System.out.println("燒水完成...");
}catch(Exception e){
e.printStackTrace();
}
}
//洗杯子
publicvoid wash(){
try{
for(int i=1;i<=10;i++){
System.out.println("洗第"+i+"個杯子");
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}
}
publicvoid run(){
if(doSomething=="water"){
shaoshui();
}
elseif(doSomething=="wash"){
wash();
}
}
}
我們再寫一個類來啓動它看一下效果:
publicclass MyThread {
publicstaticvoid main(String args[]){
Paocha shaoshui=new Paocha("water");
Paocha wash=new Paocha("wash");
shaoshui.start();
wash.start();
}
}
多線程編程是應用編程開發中的重點,在瞭解了基本的使用之後我們再繼續深入。