先看看百科對多線程的介紹
多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。[1]在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理(Multithreading)”。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程(臺灣譯作“執行緒”),進而提升整體處理性能。
每個正在系統上運行的程序都是一個進程。每個進程包含一到多個線程。進程也可能是整個程序或者是部分程序的動態執行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務。通常由操作系統負責多個線程的調度和執行。線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程.線程和進程的區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和CPU。http://baike.baidu.com/view/65706.htm?fr=aladdin
Java對多線程的支持
Java創建多線程的3種常用方法:
1)繼承Thread類
重寫Thread類的run方法,創建Thread子類實例,啟動線程。
例如:
/* * @author wxismeit@163.com wangxu */public class TreadOfextends extends Thread{PRivate int i;//重寫run()方法public void run(){for(i=0; i<50; i++){System.out.println(getName() + " " + i);//繼承Thread類時直接使用this即可獲取當前線程}}public static void main(String[] args) {System.out.println(Thread.currentThread().getName());for(int i=0; i<50; i++){if(i == 10){//直接通過創建類對象來調用start()方法new TreadOfextends().start();new TreadOfextends().start();}}}}2)實現Runnable接口
重寫run()方法,創建Runnable實例作為Thread的target。
例如:
public class ThreadOfRun implements Runnable {private int i;//實現Runnable接口中的run()方法public void run() {for(i=0; i<50; i++) {System.out.println(Thread.currentThread().getName() + " " + i);//通過實現接口來實現多線程 就不能通過this關鍵字來獲取當前進程}}public static void main(String[] args) {for(int i=0; i<50; i++) {System.out.println(Thread.currentThread().getName() + " " + i);if(i == 10) { ThreadOfRun tor = new ThreadOfRun(); //此處需要通過Thread的構造方法來new線程 new Thread(tor , "線程1").start(); new Thread(tor , "線程2").start();}}} }3)Java 5以后可以通過更強大的手段——實現Callable接口
使用FutureTask對象作為Thread的對象的target創建并啟動新線程
import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class ThreadOfCallble implements Callable<Integer> { //支持泛型 public Integer call() throws Exception { int i; for(i=0; i<50; i++) { System.out.println(Thread.currentThread().getName() + " " + i); }return i;//有返回值}public static void main(String[] args) {//創建Callable對象ThreadOfCallble toc = new ThreadOfCallble();//通過FutureTask來包裝Callable對象FutureTask<Integer> ft = new FutureTask<Integer>(toc);for(int i=0; i<50; i++) {if(i ==10) {new Thread(ft , "NewThread").start();}}try {//得到新線程的返回值System.out.println("子線程的返回值 : " + ft.get());}catch(Exception e) {e.printStackTrace();}}}三種方式的對比 : 后兩種方法非常適合多個相同的線程來處理同一份資源的情況,可以將CPU,代碼和數據分開,比較符合面向對象的思想,而且還可以繼承其他類,所以一般采用后兩種方法。
線程的生命周期 : 新建和就緒狀態 ——>運行和阻塞狀態——>線程死亡(不可復活)。
如圖:(看不到請拖動圖片)

join線程
當在某個程序執行中調用其他線程的join方法時,條用線程將被阻塞,直至被join線程執行完為止。
<pre class="java" name="code">public class ThreadOfjoin extends Thread {public ThreadOfjoin(String name) {super(name);} public void run() {for(int i=0; i<50; i++) {System.out.println(getName());}}public static void main(String[] args) {new ThreadOfjoin("NewThread").start();for(int i=0; i<50; i++) {if(i == 10) {ThreadOfjoin toj = new ThreadOfjoin("JoinedThread");toj.start();try {toj.join();//主線程調用了toj的join方法,需要等toj執行完主線程才能執行} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName());}}}未完待續 : 線程優先級,線程同步,互斥鎖,同步鎖,死鎖,線程通信。
評論區留下Email可以獲得《Java多線程設計模式》PDF版(通過網絡爬蟲小程序 自動匹配抓取你的Email并自動發送給你)
新聞熱點
疑難解答