本文章首發微信公衆號:IT筆記分享java
歡迎掃碼關注我 😊 bash
currentThread()方法能夠返回代碼被那個線程調用的信息。微信
測試方法以下:ide
public class MyThread extends Thread{
public MyThread(){
super();
}
public MyThread(String name){
super();
this.setName(name);
System.out.println("構造器中線程名字:" + Thread.currentThread().getName());
}
@Override
public void run() {
super.run();
System.out.println("this is MyThread");
System.out.println("run方法中線程名字:" + Thread.currentThread().getName());
}
public static void main(String[] args){
// 繼承Thread
MyThread myThread = new MyThread("myThread-name");
myThread.start();
}
}
複製代碼
輸出內容:測試
構造器中線程名字:main
this is MyThread
run方法中線程名字:myThread-name
複製代碼
判斷當前線程是否處於活躍狀態,活躍狀態是指線程已經啓動而且還沒有終止。this
測試代碼:spa
public class IsAliveFunc extends Thread {
@Override
public void run() {
super.run();
System.out.println("run is alive = " + this.isAlive());
}
public static void main(String[] args){
IsAliveFunc isAliveFunc = new IsAliveFunc();
System.out.println("begin start " + isAliveFunc.isAlive());
isAliveFunc.start();
System.out.println("after start " + isAliveFunc.isAlive());
}
}
複製代碼
輸出結果:操作系統
begin start false
after start true
run is alive = true
複製代碼
sleep()方法是讓正在運行的線程在指定毫秒數內暫停。線程
測試代碼:code
public class SleepFunc {
public static void sleep(){
System.out.println("begin");
try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("end");
}
public static void main(String[] args){
System.out.println(" begin time = " + System.currentTimeMillis());
sleep();
System.out.println(" end time = " + System.currentTimeMillis());
}
}
複製代碼
輸出結果:
begin time = 1551138333348
begin
end
end time = 1551138335348
複製代碼
能夠看出時間相差2秒。
獲取線程的惟一標識。
中止線程意味着在線程處理完任務以前停掉正在作的操做,也就是放棄當前操做。有如下三種方法終止正在運行中的線程:
interrupt()方法的使用並不像for+break語句那樣,立刻就中止循環。調用interrupt()方法僅僅是在當前線程中打了一箇中止的標記,並非真的中止線程。因此引出this.interrupted()和this.isInterrupted()方法。
因此使用interrupt()時須要判斷線程是否有中斷標誌,在使用return或者拋異常的方式中斷此線程。
stop方法是暴力中止線程,已經棄用的方法不建議使用。並且使用可能會拋出java.lang.ThreadDeath異常。若是強制讓線程中止則可能使一些清理性的工做的不能完成。另外一種狀況就是對鎖定的對象解鎖,出現數據不一致的狀況。
暫停線程可使用suspend()方法,使用resume()方法恢復。可是這兩個方法都是被廢棄的方法,不建議使用。這兩個方法若是使用不當會形成同步對象的獨佔,是其餘線程沒法訪問公共同步對象;也有可能產生數據不一樣步的狀況。
因此建議使用wait()方法暫停線程,使用notify()或者notifyAll()方法喚醒線程,這兩種方法會在線程後面的文章線程通訊部分講解。
yield()方法的做用的是放棄當前的CPU資源,將他讓給其餘的任務去佔用CPU執行時間,但放棄的時間不肯定,有可能剛剛放棄,立刻又得到CPU時間片。
在操做系統中,線程能夠劃分優先級,優先級高的線程獲得的CPU資源較多,也就是說CPU優先執行優先級高的線程。線程的優先級具備繼承性,好比A線程啓動B線程,則B線程的優先級與A線程的同樣。
修改優先級的方法是setPriority()。
優先級高的線程老是大部分先執行,但不表明優先級高的線程所有先執行。線程優先級還具備「隨機性」,也就是優先級高的線程不必定每次都先執行。
在Java線程中有兩種線程,一種是用戶線程,另外一種就是守護線程。守護線程具備陪伴的含義,當進程中不存在非守護線程了,則守護線程自動銷燬。典型的守護線程就是垃圾回收線程。能夠經過調用Thead類的setDaemon(true)方法設置當前的線程爲守護線程。
注意事項:
public class DaemonThread extends Thread {
private int i = 0;
@Override
public void run() {
super.run();
try {
while (true){
i++;
System.out.println("i = " + i);
Thread.sleep(1000);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public class DaemonThread extends Thread {
private int i = 0;
@Override
public void run() {
super.run();
try {
while (true){
i++;
System.out.println("i = " + i);
Thread.sleep(1000);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
複製代碼
輸出結果:
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
我離開thread對象也再也不打印了,也就是中止了!
複製代碼