1. 程式人生 > >Java中執行緒的建立和生命週期

Java中執行緒的建立和生命週期

        在作業系統中能(同時)執行多個任務(程式),每一個應用程式就是程序,多程序的作用不是提高執行速度,而是提高 CPU 的使用率。程序和程序之間的記憶體是獨立的。在一個程式中同時執行的多個獨立流程,每一個獨立的流程就是一個執行緒,多執行緒並不是在同一個時間有多個執行緒真正的同時執行,也是 cpu 會給不同的執行緒輪流分配時間片,分配的速度很快,給人的感覺就是同時執行.多執行緒的作用不是為了提高執行速度,而是提高應用程式的使用率。執行緒是程序的子集,一個程序可以有很多執行緒,每條執行緒並行執行不同的任務。每個程序是一個應用程式,都有獨立的記憶體空間同一個程序中的執行緒共享其程序中的記憶體和資源,共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,每個執行緒有自己獨立的棧。

執行緒的建立:

        執行緒的開發有兩種,一種是繼承Thread類,一種是實現Runnable介面,啟動執行緒需要呼叫start()方法,然後執行執行緒物件的run()方法中的程式碼。

public class TestThread {
    public static void main(String[] args){
        /*方式一*/
        Thread thread1 = new MyThread01();
        thread1.start();
        
        /*方式二*/
        Runnable rable = new MyThread02();
        Thread thread2 = new Thread(rable);
        thread2.start();
    }
}
/*實現方式一、繼承Thread類*/
class MyThread01 extends Thread{
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("------執行緒1----------");
        }
    }
}
/*實現方式二、通過實現Runnable介面*/
class MyThread02 implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println("---------執行緒2--------");
        }
        
    }
    
}

執行緒的完整生命週期:

執行緒的執行通常是Java虛擬機器來排程的,排程執行緒傳送給cpu指令,取得cpu的使用權,cpu在一個時刻只能執行一條指令,執行緒得到了cpu的時間片,也就是使用權後再繼續執行。


六種裝態:

起始狀態:採用new物件建立完成時;

可執行狀態:執行緒物件呼叫呼叫了start()方法,進入到可執行狀態,等待獲取時間片,執行;

執行狀態:得到CPU的時間片,執行中,執行中可能會有優先順序更高的執行緒需要執行,丟失時間片回到可執行狀態,再等待獲取時間片;

阻塞狀態:發生阻塞事件時,如當前執行緒呼叫Thread.sleep()方法、或者當前執行緒呼叫另一執行緒的join()的方法,或者呼叫了Thread.yield()方法時,當前執行緒都會進入到阻塞狀態。直到解除阻塞狀態,重新進入到到可執行狀態,等待執行;

鎖池狀態:當前執行緒執行到有一個物件有synchronized 標記的方法時,當前執行緒進入到鎖池狀態,其他執行緒也要訪問有synchronize標記的這個語句塊時,暫時都先進入到【等待佇列】,只有當前執行緒執行完畢或者呼叫了notify()或者notifyAll()方法時,其他執行緒才能進入到鎖池狀態,準備獲得鎖標記,進行執行操作。當然如果當前執行緒執行了wait()方法,與sleep不同,當前執行緒就會放棄所有的資源,進入到等待對列,等待有其他執行緒呼叫notify()和notifyAll()時進行啟用。

終止狀態:退出了run()方法,就是終止狀態了。

這就是一個執行緒的完整的生命週期。

Thread.sleep()方法:一個執行狀態的執行緒呼叫到該方法,會放棄CPU時間片,交給其他執行緒執行,本執行緒會阻塞狀態,放棄時間達到sleep設定的時間後重新再進入到可執行狀態。

join()的方法:A執行緒呼叫了B執行緒的join方法後,A 立即進入到阻塞狀態,時間片讓給B,執行緒B執行,直到執行緒B執行結束了,A執行緒才會重新進入到可執行狀態,搶奪時間片。

Thread.yield()方法:A執行緒呼叫了yield()方法,會放棄CPU的時間片,交給同優先順序的執行緒有執行的機會,但是它會立即又進入到可執行狀態,可能還會搶到CPU的時間片,繼續執行,也就是說A執行緒剛放棄CPU的時間片,沒有等到另一個執行緒搶到他會再次搶到cpu的時間片,獲得執行機會。

排程方式:

目前有兩種排程模型:分時排程模型和搶佔式排程模型,Java使用搶佔式排程模型。

分時排程模型:所有執行緒輪流使用 CPU 的使用權,平均分配每個執行緒佔用 CPU 的時間片

搶佔式排程模型:優先讓優先順序高的執行緒使用 CPU,如果執行緒的優先順序相同,那麼會隨機選擇一個。因此執行緒中可以呼叫設定優先級別。優先級別越高,得到CPU時間片點的機會越多,越先執行完。

public class TestThread {
	public static void main(String[] args){
		/*方式一*/
		Thread thread1 = new MyThread01();
		thread1.start();
		
		/*方式二*/
		Runnable rable = new MyThread02();
		Thread thread2 = new Thread(rable);
		/*1、設定優先順序需要再執行緒執行前設定,啟動後不能再設定*/
		/*最高階*/
//		thread2.setPriority(Thread.MAX_PRIORITY);
		/*最低階*/
//		thread2.setPriority(Thread.MIN_PRIORITY);
		/*標準級,預設的*/
		thread2.setPriority(Thread.NORM_PRIORITY);
		thread2.start();
	}
}

下一篇說一下執行緒併發以及執行緒安全

相關推薦

java執行池的生命週期

執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TERMINATED:termin

java執行池的生命週期執行中斷

執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TE

java執行安全執行安全的集合

  執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList   H

Java執行建立的方式:繼承thread類與實現Runnable介面

Java中執行緒的建立有兩種方式: 1.  通過繼承Thread類,重寫Thread的run()方法,將執行緒執行的邏輯放在其中 2.  通過實現Runnable介面,例項化Thread類     在實際應用中,我們經常用到多執行緒,如車站的售票系統,車站的

JAVA執行建立匿名內部類

前言 看多執行緒時,發現一些匿名內部類的東西,然後就來總結一下。   1.繼承Thread類 在類上實現匿名內部類 public class Demo1 { public static void main(String[] args) { Thread t = new T

Java執行建立生命週期

        在作業系統中能(同時)執行多個任務(程式),每一個應用程式就是程序,多程序的作用不是提高執行速度,而是提高 CPU 的使用率。程序和程序之間的記憶體是獨立的。在一個程式中同時執行的多個獨立流程,每一個獨立的流程就是一個執行緒,多執行緒並不是在同一個時間有多個執

Java執行生命週期

1、執行緒的生命週期:新建(New)、就緒(Runnable)、執行(Running)、阻塞(Blocked)和死亡(Dead)5種狀態。 2、當執行緒物件呼叫了start()方法之後,該執行緒處於就緒狀態,Java虛擬機器會為其建立方法呼叫棧和程式計數器,處於這個狀態中的執行緒並沒有開始執行,只是表示該執行

java執行建立使用

Java中實現多執行緒有兩種途徑:繼承Thread類或者實現Runnable介面。Runnable是介面,建議用介面的方式生成執行緒,因為介面可以實現多繼承,況且Runnable只有一個run方法,很適合繼承。在使用Thread的時候只需繼承Thread,並且new一個例項出

java執行建立

java中執行緒的建立 package com.carlinfo.bigdata; /** * java中執行緒的建立 */ public class Ops3 { public static void main(String[] args) { /**

java執行建立的兩種方式,六種狀態匿名內部類建立子類或實現類物件

一.匿名內部類建立子類或實現類物件 new Test(){} 相當於建立了Test類的子類物件 並且沒有類名 建立介面實現類 new 介面名() {};介面實現類的物件 注意 : new 後邊是類或者介面名 大括號內是類或者介面中的方法 public

java執行與高併發庫應用(二)執行建立定時任務Timer

1、建立執行緒的兩種方式, 通過start, 執行run方法。 第一種實現runnable, 定義類實現Runnable介面 重寫Runnable介面中的run方法 通過Thread建立執行緒物件 將Runnable介面的子類物件作為實際引數傳遞

程序程式關係類比/ java執行是哪種實現【清華大學】作業系統

本文分三個小節 1 執行緒模型 2 執行緒的實現  3 java中執行緒是使用者執行緒,核心執行緒,輕量級程序??? 3.1 臨界區 互斥 3.2 訊號量 管程 前兩小節是來自作業系統。 第三小節:看到作業系統中執行緒實現的三種方式,忽然想起我以

java執行同步Synchronized,監視器monitor鎖lock的關係是什

既然有關監視器monitor的概念比較難,大家怎麼解釋的都有。首先我給出一下java的官方文件,也是最權威的解釋: Synchronizationis built around an internal entity known as the intrinsic lock ormonitor lock. (Th

執行建立狀態

多執行緒有三種建立方法 1.看程式碼 用thread的子類建立 方式1 //用Thread子類的方法 Thread thread = new Thread() { //抽象run方法

Java的匿名物件的建立生命週期

匿名物件的特點: 1.匿名物件是沒有別其它物件所引用 2.使用一次就變成垃圾了,被垃圾回收器收回了 //匿名物件是沒有別其它物件所引用,就使用一次就變成垃圾了,被垃圾回收器收回了 public class TestMain { public void say()

java執行的兩種建立方式與比較

  首先,回顧一下作業系統課程中程序相關部分:  程序的定義:程序就是程式在一個數據集合上的一次執行過程。他與程式的區別在於程式是靜態的程式碼,而程序是動態的執行過程。  程序的特性:1.結構性,程序由程式塊、資料塊、程序控制塊(PCB)組成;          2.動態性,

Java執行 joininterrupt 方法

簡述: 使用Java多執行緒中join和interrupt函式 《Java程式設計思想》 P669 ~ P670 一個執行緒可以再其他執行緒上呼叫join()方法,其效果是等待一段時間直到第二個執行緒結束才繼續執行。 如果某個執行緒在另一個執行緒t上呼叫t.join(), 此

沉澱再出發:java執行池解析

沉澱再出發:java中執行緒池解析 一、前言    在多執行緒執行的環境之中,如果執行緒執行的時間短但是啟動的執行緒又非常多,執行緒運轉的時間基本上浪費在了建立和銷燬上面,因此有沒有一種方式能夠讓一個執行緒執行完自己的任務之後又被重複使用呢?執行緒池的出現就是為了解決這個問題。到了現在

Java執行池基本api及其作用

1.執行緒池相關的類 2.重要類的api及其方法 Executors.newCachedThreadPool() 建立一個可快取的執行緒池 Executors.newSingleThreadExecutor();建立一個只有一個執行緒執行的 不可修改的執行緒池  

Java執行的同步非同步、以及執行的安全

  什麼是執行緒同步?     這裡的“同”是協同的意思,並不是共同。那麼就很好理解同步了,就是一起操作但並不是同時操作。比如流水線組裝汽車,可以視作一個執行緒,只有裝好了上一步的門,才可以裝下一步的門窗玻璃。沒有裝門能裝上玻璃嗎?顯然不行。所以執