執行緒中簡單的方法
阿新 • • 發佈:2018-12-11
start()和run()
Start()方法:使執行緒開始執行,java虛擬機器中呼叫該執行緒的run()方法。
run()方法:如果該執行緒是使用獨立的Runnable()執行物件構造的,則執行Runnable物件的run方法;否則什麼都不執行,值得一提的是,一般我們繼承的Thread類已經實現了Runnable介面。
執行的結果
main...執行...
Thread-0...執行...
可以發現start才是啟動了一個執行緒,而run只是呼叫了類中的方法。
getName和setName方法
getName方法獲取當前執行緒的名字
setName方法設定當前執行緒的名字
執行結果是:
t1
t1...執行...
值得注意的是,run方法中不能直接呼叫getName方法
join和yield方法
join方法時暫停當前執行緒,呼叫其他執行緒,如果帶引數的,則暫停引數所給值得時間,之後繼續執行。
class DemoThread extends Thread{ public void run(){ for(int i = 0; i<10;i++){ System.out.println(Thread.currentThread().getName()+"-"+i+"...執行..."); } } } public class demo { public static void main(String[] args) { // TODO Auto-generated method stub DemoThread demoThread = new DemoThread(); demoThread.setName("t1"); demoThread.start(); for(int j =0;j<10;j++){ if(j == 1){ try { demoThread.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"-"+j+"...執行..."); } } }
執行結果
main-0...執行...
t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t1-4...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t1-8...執行...
t1-9...執行...
main-1...執行...
main-2...執行...
main-3...執行...
main-4...執行...
main-5...執行...
main-6...執行...
main-7...執行...
main-8...執行...
main-9...執行...
yield方法是使當前執行緒釋放cpu從執行狀態轉為就緒狀態,從剩餘執行緒的優先順序高的選取執行,但是如果只有當前一個執行緒的話,當先執行緒又會獲得cpu的執行許可權。
class DemoThread extends Thread{
public void run(){
for(int i = 0; i<10;i++){
System.out.println(Thread.currentThread().getName()+"-"+i+"...執行...");
if(i==4){
Thread.yield();
}
}
}
}
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
DemoThread demoThread = new DemoThread();
demoThread.setName("t1");
DemoThread demoThread2 = new DemoThread();
demoThread2.setName("t2");
demoThread.start();
demoThread2.start();
}
}
執行結果
t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t2-0...執行...
t1-4...執行...
t2-1...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t2-2...執行...
t1-8...執行...
t1-9...執行...
t2-3...執行...
t2-4...執行...
t2-5...執行...
t2-6...執行...
t2-7...執行...
t2-8...執行...
t2-9...執行...
yield方法不會釋放同步鎖 我們試著加上同步鎖
class DemoThread extends Thread{
private static Object obj = new Object();
public void run(){
synchronized(obj){
for(int i = 0; i<10;i++){
System.out.println(Thread.currentThread().getName()+"-"+i+"...執行...");
if(i==4){
Thread.currentThread().yield();
}
}
}
}
}
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
DemoThread demoThread = new DemoThread();
demoThread.setName("t1");
DemoThread demoThread2 = new DemoThread();
demoThread2.setName("t2");
demoThread.start();
demoThread2.start();
}
}
執行結果
t1-0...執行...
t1-1...執行...
t1-2...執行...
t1-3...執行...
t1-4...執行...
t1-5...執行...
t1-6...執行...
t1-7...執行...
t1-8...執行...
t1-9...執行...
t2-0...執行...
t2-1...執行...
t2-2...執行...
t2-3...執行...
t2-4...執行...
t2-5...執行...
t2-6...執行...
t2-7...執行...
t2-8...執行...
t2-9...執行...