進程是線程嗎?

小夥伴們,在面試的時候是不是經常遇到與線程有關的題目呢? 下面我把線程做了總結(含代碼實現),希望對你學習線程有幫助!


一、當我們談到線程時,很自然地會想到進程。那麼,進程與線程有什麼區別呢?

1.進程間是獨立的,表現在內存空間,上下文環境裏;線程時運行在進程空間內的。

2.在不適用特殊技術的前提下,進程是無法突破進程邊界存取其他進程內的存儲空間的;但是線程由於身處在進程空間內,所以同一進程所產生的線程共享在同意內存空間裏。

3.在同一進程中的兩端代碼不能同時執行,除非引入線程。

4.線程是屬於進程的,當進程退出時,該進程所產生的線程也都會被強制退出並清除。

5.線程佔用的資源遠遠要少於進程所佔用的資源。

6.進程和線程都可以有優先級。

7.其實在線程系統中,進程也是一個線程,可以將其理解爲一個程序的第一個線程。


二、線程是一個動態執行的過程,它也有一個從產生到死亡的過程。

1.生命週期的5種狀態:

    新建(new Thread):當創建Thread類的一個實例對象時,這個線程進入新建狀態(未被啓動)。例:Thread t = new Thread();

    就緒(runnable):線程已經被啓動,正在等待被分配給CPU時間片,就是說,此時線程正在就緒排列等候CPU資源。例:t.start();

    運行(running):線程獲得CPU資源正在執行任務(run()方法),此時,除非線程自動放棄CPU資源或者具有優先級更高的線程進入,否則線程將一直運行到結束。

    死亡(dead):當線程運行完畢或被其他線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。

             兩種終止方式:自然終止:正常運行run()方法後終止。

                                         異常終止:調用stop()方法讓一個線程終止運行。

    堵塞(blocked):由於某種原因導致正在運行的線程讓出CPU並暫停自己的運行,就是所謂的堵塞狀態。

    正在睡眠:用sleep(long t)方法可以使線程進入睡眠狀態。一個睡着的線程在指定的時間過去,可以進入就緒(runnable)狀態。

    正在等待:調用wait()方法。(調用notify()方法可以回到就緒(runnable)狀態)

    被另一個線程所阻塞:調用suspend()方法。(調用resume()方法可以恢復)

2.常用方法:

    void run()  創建該類的子類時必須實現的方法

    void start()  開啓線程的方法

    static void sleep(long t)  釋放CPU的執行權,不釋放鎖

    static void sleep(long millis,int nanos)

    final void wait()  釋放CPUT的執行權,釋放鎖

    final void notify()

    static void vied()  臨時暫停當前線程(讓線程將資源釋放出來)

還有很多方法,自己看api,這裏不多寫了... ...

3.編寫

  (1)結束線程原理:就是讓run方法結束。而run方法中通常會定義循環結構,所以只要控制住循環即可

  (2)方法----可以boolean標記的形式完成,只要在某一情況下將標記改變,讓循環停止即可讓線程結束

  (3)public final void join()//讓線程加入執行,執行某一線程join方法的線程會被凍結,等待某一線程執行結束,該線程纔會恢復到可運行狀態

4.臨界資源:多個線程間共享的數據成爲臨界資源

    互斥鎖:每個對象都對應於一個可以稱爲“互斥鎖”的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。

                 Java對象默認是可以被多個線程共用的,只是需要時才啓動“互斥鎖”機制,成爲專用對象。

                 關鍵字 synchronized 是用來與對象的互斥鎖聯繫。

                 當某個對象用 synchronized 修飾時,說明該對象已啓動“互斥鎖”機制,在任一時刻只能由一個線程訪問,即使該線程出現堵塞,該對象的被鎖定狀態也不會解除,其他線程也     不能訪問該對象。

三、一個Java簡單線程例子,幫助學習

java編寫3個線程程序,分別 獲得線程 名稱,以1000毫秒、5000毫秒、10000毫秒分別執行,顯示出來

package org.song.thread;

public class TestThread {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new MyThread("線程1",1000).start();
		new MyThread("線程2",5000).start();
		new MyThread("線程3",10000).start();
	}
}
class MyThread extends Thread{
	private long m = 0;
	MyThread(String nameString,long m){
		super(nameString);
		this.m = m;
	}
	
	public void run(){
		int x = 0;
		try {
			while (x<10) {
				System.out.println(Thread.currentThread().getName() + " 線程正在運行");
				x++;
				Thread.sleep(m);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

運行結果:

線程2 線程正在運行
線程3 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程2 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程1 線程正在運行
線程2 線程正在運行
線程3 線程正在運行
線程2 線程正在運行
線程2 線程正在運行
線程3 線程正在運行
線程2 線程正在運行
線程2 線程正在運行
線程3 線程正在運行
線程2 線程正在運行
線程3 線程正在運行
線程2 線程正在運行
線程2 線程正在運行
線程3 線程正在運行
線程3 線程正在運行
線程3 線程正在運行
線程3 線程正在運行
線程3 線程正在運行

ok,線程小結,終於敲完了!關於線程更多的知識,將會陸續更新中!希望對你有幫助,歡迎探討彼此學習


發佈了30 篇原創文章 · 獲贊 3 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章