執行緒中start()方法和run()方法的區別
Java中的執行緒是通過Java.lang.Thread實作的,可以通過實體化Thread一個物件來創建一個執行緒,然后呼叫start()啟動,但是Thread的一個特定的方法run()也可以啟動執行緒,這兩個方法有什么區別呢?
執行緒狀態
在Java當中,執行緒通常有五種狀態:創建、運行、阻塞、等待、終止
NEW------------------->新建狀態,沒有呼叫start()之前的狀態
RUNNABLE---------->運行狀態,(running執行中,ready就緒(等待cpu時間片))
BLOCKED------------>阻塞狀態,
WAITING-------------->等待狀態,沒有明確的等待結束時間,呼叫wait()
TIMED_WAITING—>超時等待狀態,有明確的等待時間,如:sleep(xxx)
TERMINATED-------->終止狀態
多執行緒原理:
我們一般使用thread new一個執行緒,然后呼叫start方法啟動,執行緒就會處于運行狀態中ready,等待CPU調度,然后再執行執行緒里面的run()方法,使用start方法才真正實作了多執行緒運行,因為這個時候不用等待我們的run方法執行完成就可以繼續執行下面的代碼,這才叫多執行緒,
如果直接使用thread執行run方法會怎么樣呢?
因為run方法是thread里面的一個普通的方法,如果直接呼叫run()方法,這個時候它會運行在主執行緒中的,因為程式中只有主執行緒一個執行緒,如果有兩個執行緒,都是直接呼叫run()方法,那么他們的執行順序一定是按順序執行的,并沒有實作多執行緒的目的,
代碼對比
public class ThreadDemo5 {
public static final boolean flag=false;
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
t1.start();
}
}
呼叫start()方法,執行緒名是默認的

public class ThreadDemo5 {
public static final boolean flag=false;
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
t1.run();
}
}
呼叫run(),執行緒名是main

可以參考下面這篇博客:
有三個執行緒,分別只能列印A,B和C,要求按順序列印ABC,列印10次
總結:start()方法來啟動執行緒,真正實作了多執行緒,run()方法當作普通方法的方式呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281241.html
標籤:java
上一篇:Java例外簡單理解
