對於多執行緒的一些理解
阿新 • • 發佈:2019-02-15
實現多執行緒的兩種方法:
繼承Thread類
實現Runnable介面
(JDK1.5之後提供了一個心得Callable介面)
在啟動多執行緒的時候必須通過start()方法,而不能直接呼叫run()方法
原因:先來看下start()方法在Thread類中的定義:
public synchronized void start(){
if(threadStatus!=0)
throw new IllegalThreadStateException();
...
start0();
...
}
private native void start0();
start()方法呼叫時會丟擲“IllegalThreadStateException”異常,一般在重複呼叫的時候會丟擲,而實際上正真呼叫的是start()方法。此方法在宣告時使用了native關鍵字宣告,表示呼叫本機的作業系統函式。因為多執行緒需要依靠底層作業系統的支援。
一個類如果只能繼承Thread類才能實現多執行緒,則肯定會受到單繼承的侷限,所以一般來說,要實現多執行緒,可以通過實現Runnable介面完成;
實現Runnable介面可以資源共享
package thread; /** * 實現Runnable介面可以資源共享 * */ public class BaseThread implements Runnable{ private int ticket = 5; @Override public void run() { for(int i=0;i<20;i++){ if(ticket>0){ System.out.println("賣票:ticket = "+ticket--); } } } public static void main(String[] args) { BaseThread my = new BaseThread(); //啟動3個執行緒 new Thread(my).start(); new Thread(my).start(); new Thread(my).start(); } }
結果:
賣票:ticket = 5
賣票:ticket = 3
賣票:ticket = 4
賣票:ticket = 1
賣票:ticket = 2
執行緒的休眠 執行緒的中斷
package thread; /** * 執行緒的休眠 * 執行緒的中斷 * */ public class InterruptThread implements Runnable{ @Override public void run() { System.out.println("1.進入run方法!"); try { Thread.sleep(10000); System.out.println("2.已完成休眠!"); } catch (InterruptedException e) { System.out.println("3.休眠被終止!"); return; } System.out.println("4.run方法正常結束!"); } public static void main(String[] args) { InterruptThread my = new InterruptThread(); Thread t =new Thread(my); t.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { } t.interrupt(); } }
執行緒的強制執行
package thread;
/**
* 執行緒的強制執行
*
*/
public class JoinThread implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"執行 -->" +i);
}
}
public static void main(String[] args) {
JoinThread my = new JoinThread();
//啟動3個執行緒
Thread t =new Thread(my);
t.start();
for (int i = 0; i < 10; i++) {
if(i>5){
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"執行main -->" +i);
}
}
}
執行緒禮讓
package thread;
/**
* 執行緒禮讓
*
*/
public class YieldThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"執行:--->"+i);
if (i==3) {
System.out.println("執行緒禮讓:");
Thread.currentThread().yield();
}
}
}
public static void main(String[] args) {
YieldThread my = new YieldThread();
Thread t1 =new Thread(my,"執行緒1");
Thread t2 =new Thread(my,"執行緒2");
t1.start();
t2.start();
}
}