JAVA執行緒物件的狀態
JAVA執行緒物件的狀態
1.概述
在Thread類中定義了執行緒的6種狀態:新建態,就緒態、執行態,阻塞態、等待態、終止態。
1)新建態:使用new運算子建立一個執行緒物件(new Thread)後,該執行緒僅僅是一個空物件,系統沒有為它分配資源,該執行緒處於新建態(NEW)。
2)就緒態和執行態
從作業系統角度來看,處於新建態的執行緒啟動後,進入就緒態,再由作業系統排程執行而成為執行態。由於執行緒排程是由作業系統控制和管理,程式無法控制。所以,從程式設計角度看,執行緒啟動後即進入執行態(RUNNABLE),程式中不需要區分就緒態或執行態。
進入執行態的執行緒物件,系統執行執行緒物件的run()
3)阻塞態和等待態
一個執行態的執行緒因某種原因不能繼續執行時,進入阻塞態(BLOCKED)或等待態。處於阻塞態或等待態的執行緒不能執行,即使處理器空閒也不能執行。只有當引起阻塞的原因被消除,或等待的條件滿足時,執行緒再轉入執行態,重新進入執行緒佇列排隊等待執行,再次執行時即從暫停處繼續執行。
導致執行緒進入阻塞態或等待態的原因有很多種,如輸入/輸出、等待訊息、睡眠、鎖定等。等待態有兩種WAITING和TIMED_WAITING,前者的等待時間不確定,後者的等待時間確定。
4)終止態
執行緒物件停止執行未被撤銷時總是終止態的(TERMINATED)。導致執行緒終止有兩種原因:執行結束或被強制停止。當執行緒物件的
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