Java多線程機制--Java中的線程

Java多線程機制--Java中的線程

一、首先理解程序、進程與線程的關係(略,需個人思考理解)。

其中每個進程都有一段專用的內存區域,但是線程之間可以共享相同的內存單元,利用這些共享單元實現數據交換,實時通信和必要的同步操作。

二、線程的狀態和生命週期

1、新建

Thread類或者其子類被聲明時,已經分配相應的內存空間和資源。但JVMjava虛擬機)尚未將CPU的使用權分給它。

2、運行

線程通過調用start()方法,通知JVM此線程進入等待使用CPU的隊列中。

JVMCPU使用權切換給這個線程時,就會運行類內的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_PRIORITYThread.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();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章