Java多線程機制--Java中的線程
一、首先理解程序、進程與線程的關係(略,需個人思考理解)。
其中每個進程都有一段專用的內存區域,但是線程之間可以共享相同的內存單元,利用這些共享單元實現數據交換,實時通信和必要的同步操作。
二、線程的狀態和生命週期
1、新建
Thread類或者其子類被聲明時,已經分配相應的內存空間和資源。但JVM(java虛擬機)尚未將CPU的使用權分給它。
2、運行
線程通過調用start()方法,通知JVM此線程進入等待使用CPU的隊列中。
當JVM將CPU使用權切換給這個線程時,就會運行類內的run()方法。因此當通過Thread子類創建的線程時,必須重寫子類的run()方法。Run()方法規定了該線程的具體使命。
注意:在線程沒有結束run方法時,不要調用start()方法,否則會出現IllegalArgumenException。
3、中斷
四種原因:
- JVM調動。
- 調用sleep()方法。
- 調用wait()方法,一直等待知道其他線程調用notifi()方法通知它甦醒。
- 進入阻塞階段。
4、死亡
正常死亡即運行完run方法。
非正常死亡即線程被強行終止。
總之,死亡即釋放分配給線程對象的內存。
示例代碼:
SpeakHello.java
package com.java.study.until;
public class SpeakHello extends Thread {
public void run() {
for (int i = 0; i < 15; i++) {
System.out.println("Hello" + i + "");
}
}
}
SpeakNihao.java
package com.java.study.until;
public class SpeakNihao extends Thread {
public void run() {
for (int i = 0; i < 15; i++) {
System.out.println("你好" + i + "");
}
}
}
ThreadTest01.java
package com.java.study;
import com.java.study.until.SpeakHello;
import com.java.study.until.SpeakNihao;
public class ThreadTest01 {
public static void main(String[] args) {
SpeakHello hello;
SpeakNihao nihao;
hello = new SpeakHello();
nihao = new SpeakNihao();
hello.setPriority(10);
hello.start();
nihao.start();
for (int i = 0; i < 15; i++) {
System.out.println("大家好" + i + "");
}
}
}
三、線程調度和優先級
Java虛擬機中的線程調度器負責管理線程。
調度器把線程分爲10個等級,分別用Thread類的常量表示即Thread.MIN_PRIORITY和Thread.MAX_PRIORITY之間,如果明確聲明,系統默認優先度爲5,即Thread.NORM_PRIORITY。
我們可以通過調用setPriority()方法設置優先度,也可以通過getPriority()得到一個線程的優先度。
但是,不提倡使用線程優先度來確保算法的正確執行,要保證線程在CPU資源不足的情況下,仍能正確運行。
四、Thread的子類創建線程
需要重寫run()方法,因爲父類中的run()方法內沒有操作語句。
爲了使結果儘量不依賴CPU資源的使用情況,應當讓線程主動調用sleep()方法,讓出CPU的使用權。
示例代碼:
People.java
package com.java.study.until;
public class People extends Thread {
StringBuffer str;
public People(String sex,StringBuffer str) {
this.str = str;
//調用從父類Thread繼承的setName()方法爲線程起名字。
setName(sex);
}
public void run() {
for(int i = 0;i<3;i++){
str.append(getName()+",");
System.out.println("我是"+getName()+"字符串爲:"+str);
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
ThreadTest00.java
package com.java.study;
import com.java.study.until.People;
public class ThreadTest00 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
new People("帥哥",sb).start();
new People("美女",sb).start();
}
}