1. 程式人生 > >JAVA執行緒物件的狀態

JAVA執行緒物件的狀態

JAVA執行緒物件的狀態

1.概述

Thread類中定義了執行緒的6種狀態:新建態,就緒態、執行態,阻塞態、等待態、終止態。

1)新建態:使用new運算子建立一個執行緒物件(new Thread)後,該執行緒僅僅是一個空物件,系統沒有為它分配資源,該執行緒處於新建態(NEW)。

2)就緒態和執行態

從作業系統角度來看,處於新建態的執行緒啟動後,進入就緒態,再由作業系統排程執行而成為執行態。由於執行緒排程是由作業系統控制和管理,程式無法控制。所以,從程式設計角度看,執行緒啟動後即進入執行態(RUNNABLE),程式中不需要區分就緒態或執行態。

進入執行態的執行緒物件,系統執行執行緒物件的run()

方法。

3)阻塞態和等待態

一個執行態的執行緒因某種原因不能繼續執行時,進入阻塞態(BLOCKED)或等待態。處於阻塞態或等待態的執行緒不能執行,即使處理器空閒也不能執行。只有當引起阻塞的原因被消除,或等待的條件滿足時,執行緒再轉入執行態,重新進入執行緒佇列排隊等待執行,再次執行時即從暫停處繼續執行。

導致執行緒進入阻塞態或等待態的原因有很多種,如輸入/輸出、等待訊息、睡眠、鎖定等。等待態有兩種WAITINGTIMED_WAITING,前者的等待時間不確定,後者的等待時間確定。

4)終止態

執行緒物件停止執行未被撤銷時總是終止態的(TERMINATED)。導致執行緒終止有兩種原因:執行結束或被強制停止。當執行緒物件的

run()方法執行結束時,該執行緒物件進入終止態,等待系統撤銷物件所佔用的資源;當程序因故障停止執行時,該程序中的所有執行緒將被強行終止。

2.Thread類中改變和片段執行緒狀態的方法

Thread 類中定義了start(),sleep(),interrupt()等多個改變執行緒狀態的方法,以及isAlive(),isInterrupt()等判斷執行緒狀態的方法。執行緒的執行機制如下圖所示:

3.例項:滾動字顯示執行緒狀態及改變方法.

本例演示了執行緒物件的生命週期從建立到終止的過程,其中使用了new(),start(),sleep(),interrupt()等方法改變執行緒的狀態。程式執行的介面如下圖所示:

 

程式如下:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class WelcomeJFrame extends JFrame

{

private JDialog dialog;

private JLabel labelDialog;

public WelcomeJFrame(String[] texts)

{

super("滾動字");

this.setSize(400,300);

this.setLocation(300, 240);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

if(texts == null || texts.length == 0)

this.add(new RollbyJPanel("Welcome!"));

else

{

this.setLayout(new GridLayout(texts.length,1));

for(int i = 0; i < texts.length; i++)

{

this.add(new RollbyJPanel(texts[i]));

}

}

this.setVisible(true);

dialog = new JDialog(this,"提示",true);

dialog.setSize(240,80);

labelDialog = new JLabel("",JLabel.CENTER);

dialog.add(labelDialog);

dialog.setDefaultCloseOperation(HIDE_ON_CLOSE);

}

public WelcomeJFrame()

{

this(null);

}

private class RollbyJPanel extends JPanel implements ActionListener,Runnable

{

private JTextField textWord,textSleep;

private JButton buttonStart,buttonInterrupt;

private JTextField textState;

private Thread threadRollby;

private int sleepTime;

private RollbyJPanel(String text)

{

this.setLayout(new GridLayout(2,1));

for(int i = 0; i < 100; i++)

text = text +" ";

textWord = new JTextField(text);

this.add(textWord);

JPanel panelSub = new JPanel(new FlowLayout(FlowLayout.LEFT));

this.add(panelSub);

panelSub.add(new JLabel("sleep"));

this.sleepTime = (int) (Math.random()*100);

textSleep = new JTextField("" + sleepTime,5);

panelSub.add(textSleep);

textSleep.addActionListener(this);

buttonStart = new JButton("啟動");

panelSub.add(buttonStart);

buttonStart.addActionListener(this);

buttonInterrupt = new JButton("中斷");

panelSub.add(buttonInterrupt );

buttonInterrupt .addActionListener(this);

threadRollby = new Thread(this);

buttonInterrupt.setEnabled(false);

panelSub.add(new JLabel("state"));

textState = new JTextField("" + threadRollby.getState(),10);

textState.setEditable(false);

panelSub.add(textState);

}

@Override

public void run()

{

// TODO Auto-generated method stub

while(threadRollby.isAlive() && !threadRollby.isInterrupted())

{

try

{

String str = textWord.getText();

str = str.substring(2)+ str.substring(0, 2);

textWord.setText(str);

threadRollby.sleep(sleepTime);

}

catch(InterruptedException e)

{

break;

}

}

}

@Override

public void actionPerformed(ActionEvent e)

{

// TODO Auto-generated method stub

if(e.getSource() == buttonStart)

{

threadRollby = new Thread(this);

threadRollby.start();

textState.setText("" + threadRollby.getState());

buttonStart.setEnabled(false);

buttonInterrupt.setEnabled(true);

}

if(e.getSource() == buttonInterrupt)

{

threadRollby.interrupt();

textState.setText("" + threadRollby.getState());

buttonStart.setEnabled(true);

buttonInterrupt.setEnabled(false);

}

if(e.getSource() == textSleep)

{

try

{

sleepTime = Integer.parseInt(textSleep.getText());

}

catch(NumberFormatException nfe)

{

labelDialog.setText("/"" + textSleep.getText() + "/" 不能轉換成整數,請重新輸入!" );

dialog.setLocation(this.getX() + 200, this.getY() + 200);

dialog.setVisible(true);

}

}

}

}

public static void main(String[] args)

{

// TODO Auto-generated method stub

String[] texts = {"hello","java","thread"};

new WelcomeJFrame(texts);

}

}

4.總結

這個例項討論了JAVA執行緒物件的狀態,及其怎樣實現執行緒狀態的改變以及執行緒物件狀態的讀取。這只是對JAVA執行緒一個初步認識。

相關推薦

JAVA執行物件狀態

JAVA執行緒物件的狀態 1.概述 在Thread類中定義了執行緒的6種狀態:新建態,就緒態、執行態,阻塞態、等待態、終止態。 1)新建態:使用new運算子建立一個執行緒物件(new Thread)後,該執行緒僅僅是一個空物件,系統沒有為它分配資源,該執行緒處於新建態(NEW

java執行狀態轉換

執行緒狀態圖 說明: 執行緒共包括以下5種狀態。 1. 新建狀態(New)         : 執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。 2. 就緒狀態(Runnable): 也被稱為“可執行狀態”。執行

java執行狀態變換

下面將會針這張圖對執行緒的狀態轉換來做解釋 在作業系統的課程中把執行緒大致分為了3個狀態 1.就緒狀態(執行緒對資源上鎖,但未分配時間片,等待cpu分配,隨時可以執行) 2.執行狀態(執行緒對資源上鎖,並擁有了時間片,正在執行中) 3.阻塞狀態(在執行狀態下缺失了某種資源導致執行暫

java執行狀態

NEW 狀態是指執行緒剛建立, 尚未啟動 RUNNABLE 狀態是執行緒正在正常執行中, 當然可能會有某種耗時計算/IO等待的操作/CPU時間片切換等, 這個狀態下發生的等待一般是其他系統資源, 而不是鎖, Sleep等 BLOCKED 這個狀態下, 是在

java執行物件鎖、類鎖、同步機制詳解

1.在java多執行緒程式設計中物件鎖、類鎖、同步機制synchronized詳解:     物件鎖:在java中每個物件都有一個唯一的鎖,物件鎖用於物件例項方法或者一個物件例項上面的。     類鎖:是用於一個類靜態方法或者class物件的,一個

JVM學習之java執行實現&排程和狀態轉換

以下blog內容來自《深入理解Java虛擬機器_JVM高階特性與最佳實踐》感謝作者! 1 謹慎使用java 多執行緒   如何提升效率:      使用java時推薦利用多執行緒處理一些操作絕大多數情況下確實能提高效率,提高效率的原理

java 執行執行狀態

java執行緒狀態 1. 初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。 2. 執行(RUNNABLE): Java執行緒中將就緒(ready)和執行中(running)兩種狀態籠統的稱為“執行”。 執行緒物件建立後,其他執行緒(比如main執行緒)呼叫了該物件

Java執行的建立、執行的生命週期狀態

重新認識Java執行緒建立的三種方式:   繼承Thread類   1.通過繼承Thread類建立Thread子類,並重寫run方法。run方法的方法體表示執行緒類要完成的任務,因此也把run方法稱為執行體。 2.建立Thread子類的例項物件,就是建立了執行

Java執行的6種狀態及切換

原文:https://blog.csdn.net/pange1991/article/details/53860651#commentBox Java中執行緒的狀態分為6種。     1. 初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。

Java執行執行狀態執行狀態

執行緒狀態:     執行緒共包括以下5種狀態。1. 新建狀態(New)  執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable)  也被稱為“可執行狀態”。執行緒物件被建立後,

java執行物件鎖 類鎖 同步機制詳解

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行狀態詳解

執行緒狀態 執行緒狀態總共可分為五大狀態: 新建 可執行 執行 等待阻塞睡眠 死亡,如下圖所述: 1.新建(NEW): 執行緒物件已經建立,但還沒呼叫start()方法。 2.可執行(RUNNABLE): 當執行緒有資格執行,但還沒有獲得cpu資源。當start()方法呼叫後,執行緒先

Java執行的6種狀態及切換(透徹講解)-本文系轉載

Java執行緒的6種狀態及切換(透徹講解) 轉自:https://mp.weixin.qq.com/s/hUOwck4lMp7c_rvY4TTeQQ Java中執行緒的狀態分為6種。 1.  初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。

Java執行狀態切換詳解

一、執行緒狀態說明 java.lang.Thread類中定義了執行緒狀態列舉java.lang.Thread.State,以下為各狀態說明。 1、NEW(新建) /** * Thread state for a thread whic

Java執行狀態以及 sheep()、wait()、yield() 的區別

前言 最近看到很多人都在討論多執行緒的問題,於是寫出了這篇部落格,希望可以幫到正在學習和使用這塊的朋友們,首先我們先看看兩個圖(兩個圖都來自其他碼農的分享)。   這兩個圖是一樣的邏輯,這裡一起羅列出來,下面讓我們用語句來簡單描述下兩個圖: sleep 讓執行緒從 【run

Java執行的6種狀態及切換(透徹講解)

來源:https://blog.csdn.net/pange1991/article/details/53860651 Java中執行緒的狀態分為6種。 1.初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。 2.執行(RUNNABLE):J

Java執行的6種狀態及切換(透徹講解)

Java中執行緒的狀態分為6種。 1. 初始(NEW):新建立了一個執行緒物件,但還沒有呼叫start()方法。 2. 執行(RUNNABLE):Java執行緒中將就緒(ready)和執行中(running)兩種

JVM學習之java執行實現&排程和狀態轉換

1 謹慎使用java 多執行緒   如何提升效率:      使用java時推薦利用多執行緒處理一些操作絕大多數情況下確實能提高效率,提高效率的原理在哪裡呢,為什麼說絕大多說情況呢。        在CPU單核時代,我們知道某一時刻工作的執行緒只能是一條,那多執行緒為什

java中程序和執行以及執行狀態和方法

程序是cpu資源分配的最小單位,執行緒是cpu排程的最小單位。 一個程式至少有一個程序,一個程序至少有一個執行緒.  執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

Java執行執行狀態以及之間的切換(轉)

 博主最近幾天在面試的時候,被面試官問到了Java多執行緒的幾種狀態,無疑博主已經把該忘記的都忘記了,很是尷尬,回到家中在網上找到一篇部落格,博主認真閱讀了此文章,寫的很詳細,現轉載分享給大家: Java中執行緒的狀態分為6種。     1. 初始(N