執行緒的生命週期的方法
執行緒的生命週期:
指執行緒從建立到啟動,直至執行結束,可以通過呼叫Thread的相關方法影響執行緒的執行狀態
執行緒的執行狀態::
新建、可執行、執行、阻塞、死亡
yield():若當前執行緒呼叫該方法,則由執行狀態變成可執行狀態
package org.jsoft.Thread;
public class YieldThreadTest extends Thread{
public static void main(String[] args) {
Thread t1 = new YieldThreadTest("執行緒-1");
Thread t2 = new YieldThreadTest("執行緒-2");
t1.start();
t2.start();
}
public YieldThreadTest(String name){
super(name);//這的name第什麼,threadName就是什麼
}
public void run() {
super.run();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i%10 == 0){
yield();//讓當前程序重新進入到可執行狀態,也就是讓出了CPU的控制權,誰搶到誰就執行
}
}
}
}
進入阻塞狀態下的三種情況:
1.呼叫sleep方法(使當前執行緒休眠一段時間,以毫秒為單位)
2.呼叫join方法(處在執行狀態的執行緒如果呼叫了其他執行緒的join方法,將被掛起進入阻塞狀態,目標執行緒執行完畢後才會接觸阻塞,回到可執行狀態)
3.執行I/0操作-
join()例子:
package org.jsoft.Thread;
public class JoinThreadTest extends Thread{
public static void main(String[] args) {
Thread t1 = new JoinThreadTest();
t1.start();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i == 10){
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void run() {
super.run();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
}
}
}
interrupt():可以解除執行緒的阻塞狀態
package org.jsoft.Thread;
public class InterruptThreadTest extends Thread{
public static void main(String[] args) {
InterruptThreadTest t1 = new InterruptThreadTest();
t1.start();
//呼叫阻塞執行緒的interrupt方法(執行緒睡眠時,呼叫該執行緒的interrupt方法會丟擲interrruptedException)
t1.interrupt();
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i == 10){
try {
Thread.sleep(1000000);//子類不能丟擲比父類更大的異常,所以只能try catch
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
isAlive()判斷執行緒是否活著(即非死亡狀態):
package org.jsoft.Thread;
public class IsAliveThreadTest extends Thread{
public static void main(String[] args) {
IsAliveThreadTest thread = new IsAliveThreadTest();
System.out.println(thread.isAlive());//false,因為執行緒還沒有執行
thread.start();//進行可執行狀態,搶佔CPU的資源
System.out.println(thread.isAlive());//true,因為執行緒執行了
//在當前的main執行緒中呼叫thread執行緒的join()來讓thread這個執行緒執行完畢,掛起當前的main執行緒
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.isAlive());//false,因為執行緒執行完畢
thread.start();//執行緒執行完畢後在開啟則會報錯:java.lang.IllegalThreadStateException
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
}
}
}