第一章 Java多執行緒技能
阿新 • • 發佈:2019-01-24
一個程序正在執行時至少會有1個執行緒正在執行。
public class Test {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
}
}
輸出結果:
main
分析:
一個名稱叫做main的執行緒在執行main()方法中的程式碼。
執行緒是一個子任務,cpu是以隨機的時間來呼叫執行緒中的run方法。程式碼的執行結果與程式碼執行順序或呼叫的順序無關。
public class MyThread extends Thread {
private int count=5;
@Override
synchronized public void run() {
super.run();
count--;
System.out.println("由"+this.currentThread().getName()+" 計算,count="+count);
}
}
分析:通過在run方法前加入synchronized關鍵字,使多個執行緒在執行run方法時以排隊的方法進行處理。當一個現在在呼叫run前,先判斷run方法有沒有被上鎖,如果上鎖,說明有其他執行緒正在呼叫run方法,必須等其他執行緒對run方法呼叫結束後才可以執行run方法。synchronized 可以在任意物件及方法上加鎖,而加鎖的這段程式碼稱為“互斥區”或“臨界區”。
currentThread()方法可返回該程式碼段是正在被哪個執行緒呼叫。
package mythread;
public class MyThread extends Thread {
public MyThread() {
System.out.println("構造方法的列印:" + Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("run方法的列印:" + Thread.currentThread().getName());
}
}
package run;
import mythread.MyThread;
public class Run2 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.start();
}
}
輸出結果:
構造方法的列印:main
run方法的列印:Thread-0
----------
package run;
import mythread.MyThread;
public class Run2 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.run();
}
}
輸出結果:
構造方法的列印:main
run方法的列印:main
isAlive()的功能判斷當前的程序是否處於活動狀態
sleep()的作用是在指定的毫秒數讓當前“正在執行的執行緒”休眠,即暫停執行。這個“正在執行的執行緒”是指this.currentThread()返回的執行緒
getId()方法的作用是取得執行緒的唯一標識
interrupt()方法停止執行緒
this.interrupted()//測試當前執行緒是否已經中斷,執行後具有將狀態標誌設定為false
this.isInterrupted()//測試執行緒是否已經中斷,執行後不清除狀態標誌
使用return停止執行緒
package extthread;
public class MyThread extends Thread {
@Override
public void run() {
while (true) {
if (this.isInterrupted()) {
System.out.println("停止了!");
return;//停止執行緒
}
System.out.println("timer=" + System.currentTimeMillis());
}
}
}
package test.run;
import extthread.MyThread;
public class Run {
public static void main(String[] args) throws InterruptedException {
MyThread t=new MyThread();
t.start();
Thread.sleep(4000);//使main執行緒休眠4秒
t.interrupt();//暫停執行緒
}
}
yield()方法的作用是放棄當前的CPU資源,將它讓給其他的任務佔用CPU,但放棄的時間不確定。