1. 程式人生 > >對java多執行緒的理解

對java多執行緒的理解

在理解多執行緒之前我們要理解程序和執行緒:

程序指每個獨立程式在計算機上的一次執行活動,例如QQ360管家

執行緒就是一個程式內部的一條執行路徑,如果一個程式中可以同一時間執行多個執行緒,我們就說這個程式是支援多執行緒的;比如迅雷下載軟體可以同時下載多個任務。

什麼事多執行緒?

多執行緒可以理解成多工,一個程式在同一時間內執行多個任務,每個任務通常可以理解成一個執行緒,這種能執行多個執行緒的程式稱之為多執行緒程式。

為什麼需要多執行緒?

多執行緒作為一種多工併發的工作方式,具有以下特點:

提高應用程式響應

提高計算機CPU的利用率

改善程式結構。一個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改。

執行緒狀態:新建、可執行、阻塞、等待、中止等,如圖:

建立新執行緒的方式:

繼承Thread類  2.實現Runnable介面

宣告執行緒:

單執行緒:Thread 執行緒名 = new Thread(new 執行緒類());

 多執行緒: 

             執行緒類  物件名A=new 執行緒類();

             Thread 執行緒名1=new Thread(物件名A);

             Thread 執行緒名2=new Thread(物件名A);

程式碼如下:

/**

 * 

 * 實現Runnable介面建立執行緒

 *

 */

public class FirstThread implements Runnable {

public void run() {

//要線上程中執行的程式碼

for(int i=0;i<100;i++){

System.out.println(Thread.currentThread().getName()+"MyRunnable:"+i);

}

}

}

/**

 * 繼承Thread建立執行緒

 */

/*public class FirstThread extends Thread(){

public void run(){

//要線上程中執行的程式碼

for(int i=0;i<100;i++){

System.out.println("MyThread:"+i);

}

}*/

public class FirstThreadTest {

/**

 * 建立和啟動多個執行緒

 */

public static void main(String[] args) {

System.out.println("主執行緒開始執行。。。。");

/* 宣告執行緒1 */

Thread t1 = new Thread(new FirstThread());

/* 啟用執行緒 */

t1.start();

Thread t2 = new Thread(new FirstThread());

t2.start();

}

}

1.  執行緒睡眠:

/**

 * 

 * 執行緒睡眠:

 * 1.執行緒體中呼叫sleep()方法使當前執行緒進入睡眠狀態,呼叫sleep()方法

 * 需要傳入一個毫秒數作為當前執行緒的睡眠時間,執行緒睡眠相應的時間便會甦醒,

 * 重新進入可執行狀態

 * 2.在實際案例開發中,為了調整各個子執行緒的執行順序,可以通過

 * 執行緒睡眠的方式來完成

 *

 */

public class ThreadSleep implements Runnable {

public void run() {

try {

Thread.sleep(100);//讓執行緒睡100毫秒

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i=0;i<100;i++){

          System.out.println(Thread.currentThread().getName()+"    "+i);

}

}

}

public class ThreadSleepTest {

/**

 * 執行緒睡眠測試

 */

public static void main(String[] args) {

System.out.println("主執行緒執行。。。");

//宣告執行緒

Thread t1=new Thread(new ThreadSleep());

//啟用執行緒

t1.start();

Thread t2=new Thread(new ThreadSleep());

t2.start();

}

}

//問題:打印出很多重複的數字。。。

2. 執行緒讓步:

/**

 * 

 * Thread.yield()方法會暫停當前正在執行的執行緒物件,把執行機會

 * 讓給相同或更高優先順序的執行緒。

 *

 */

public class ThreadYield implements Runnable {

public void run() {

for(int i=0;i<100;i++){

System.out.println(Thread.currentThread().getName()+": "+i);

if(i%10==0){//i能被10整除時,當前執行緒讓步給其他執行緒

Thread.yield();

}

}

}

}

public class ThreadYieldTest {

/**

 * 執行緒讓步測試

 */

public static void main(String[] args) {

Thread t1=new Thread(new ThreadYield());

t1.start();

Thread t2=new Thread(new ThreadYield());

        t2.start();

}

}

3. 執行緒的加入:

/**

 * 

 * 執行緒的加入:

 * 有時需要執行緒間的接力來完成某項任務,這需要呼叫執行緒類jion()方法,jion()方法

 * 可以使兩個交叉執行的執行緒程式設計順序執行。

 * 注:A執行緒加入到B執行緒中,等A執行緒執行完了B執行緒才會拿到執行權開始執行。

 * (Jion誰就是要等誰執行結束)

 *

 */

public class ThreadJion implements Runnable {

public void run() {

for(int i=0;i<=20;i++){

System.out.println(Thread.currentThread().getName()+":"+i);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public class ThreadJionTest {

/**

 * 執行緒的加入測試類

 */

public static void main(String[] args) {

          Thread t1=new Thread(new ThreadJion());

          t1.start();

          /*主執行緒執行for迴圈*/

          for(int i=1;i<=50;i++){

           System.out.println(Thread.currentThread().getName()+":  "+i);

           if(i==30){

           try {

t1.join();  //把子執行緒加入到主執行緒執行

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

           }

          }

}

}