1. 程式人生 > >黑馬程式設計師----基礎學習第十二天

黑馬程式設計師----基礎學習第十二天

                                             

                                       ------- android培訓java培訓、期待與您交流! ----------                                            

           多執行緒。

一、JAVA的多執行緒

程序:在作業系統中一個可執行檔案就是一個程序。DOS作業系統就是單使用者單程序的作業系統;Windows是屬於多使用者多程序的作業系統

執行緒:一個程序中的多條路徑

二、實現多執行緒的兩種方法:

1、寫一個自己的執行緒類實現Runable介面,在main()方法裡面使用Thread這個類分配新的一個實現了Runnable介面的Thread物件,然後呼叫start方法開啟執行緒。

如下程式碼所示:

import java.lang.*;

public classtest{

public static void main(String[] args) throws Exception{

            Thread t1 new Thread(new MyThread("m1"));

            t1.start(); 

            Thread t2 new Thread(new MyThread("m2"));

            t2.start(); 

   }       

}

class MyThread implements

Runnable{

public MyThread(String name){

this.name = name;

   }

   String name;  

public void run(){

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

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

            }

   }

}

2寫一個類直接繼承至Thread這個類,然後在main()方法裡面直接將我們寫的類例項化然後呼叫start()這個方法實現功能。

如下這個程式程式碼:

import java.lang.*;

public classtest{

public static void main(String[] args) throws Exception{

            MyThread t1 new MyThread("m1");

            t1.start(); 

            MyThread t2 new MyThread("m2");

            t2.start(); 

   }       

}

class MyThread extendsThread{

public MyThread(String name){

this.name = name;

   }

   String name;

public void run(){

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

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

            }

   }

}

兩個實現多執行緒方法的個人總結 : 

既然有兩個實現執行緒的方法,那麼我們在現實程式設計當中該選用哪一種呢?我們從程式碼上來看可能會說第二中比較好,因為在建立物件的時候比較簡單。但是實際上要第一種方法比較實用,因為我們知道JAVA是單繼承的,如果我們自己寫的這個執行緒類已經繼承了一個類那麼就不能在實現介面了,然而JAVA可以多實現,也就是說可以同時實現多個介面,這樣的話就可以根據我們自己的需要適當的增加我們的執行緒類的功能,綜上我們就顯然的可以知道第一種實現Runnable介面的方法比較好比較實用。

下面我們用一個流程圖來形象的描述一下執行緒的執行過程:

三、執行緒同步

1、概念:就是說多個執行緒同時訪問一個檔案

知識擴充套件: 怎麼解決這個執行緒問題呢? 

唯一的辦法就是給執行緒加鎖。只有當執行緒執行完畢之後自動解鎖然後別的執行緒就可以對其進行訪問。

2、給執行緒加鎖的關鍵字是synchronized,加鎖的方法有兩種:

1)、 把這個關鍵字加在方法上,只要執行了這個m方法,就會鎖住呼叫這個m方法的物件。當執行完方法體之後自動解鎖

2)、 在一個方法裡面再用關鍵字寫一個方法,可以把具體的屬性傳給他,這樣的話就可以對具體的給某一個屬性加鎖。

以下就是使用第二種方法模擬的一個執行緒死鎖的源程式 : 

import java.lang.*;

public classtest{

public static void main(String[] args) throws Exception{

                    Thread t1new Thread(new MyThread("t1"));

                    t1.start();

                    Thread t2 new Thread(new MyThread("t2"));

                    t2.start();

   }       

}

class MyThread implementsRunnable{

static Object o1 = new Object();

static Object o2 = new Object();

   String name;

   MyThread(String name){

this.name = name;

   }

public void run(){

if("t1".equals(name)){

synchronized(o1){

                               System.out.println("執行緒t1鎖住了o1");

synchronized(o2){

                                        System.out.println("執行緒t1鎖住了o2");

                               }

                     }

            }

if("t2".equals(name)){

synchronized(o2){

                               System.out.println("執行緒t2鎖住了o2");

synchronized(o1){

                                        System.out.println("執行緒t2鎖住了o1");

                               }

                     }

            }

   }

}

三、執行緒同步

1、概念:就是說多個執行緒同時訪問一個檔案

知識擴充套件: 怎麼解決這個執行緒問題呢? 

唯一的辦法就是給執行緒加鎖。只有當執行緒執行完畢之後自動解鎖然後別的執行緒就可以對其進行訪問。

2、給執行緒加鎖的關鍵字是synchronized,加鎖的方法有兩種:

1)、 把這個關鍵字加在方法上,只要執行了這個m方法,就會鎖住呼叫這個m方法的物件。當執行完方法體之後自動解鎖

2)、 在一個方法裡面再用關鍵字寫一個方法,可以把具體的屬性傳給他,這樣的話就可以對具體的給某一個屬性加鎖。

以下就是使用第二種方法模擬的一個執行緒死鎖的源程式 : 

import java.lang.*;

public classtest{

public static void main(String[] args) throws Exception{

                    Thread t1new Thread(new MyThread("t1"));

                    t1.start();

                    Thread t2 new Thread(new MyThread("t2"));

                    t2.start();

   }       

}

class MyThread implementsRunnable{

static Object o1 = new Object();

static Object o2 = new Object();

   String name;

   MyThread(String name){

this.name = name;

   }

public void run(){

if("t1".equals(name)){

synchronized(o1){

                               System.out.println("執行緒t1鎖住了o1");

synchronized(o2){

                                        System.out.println("執行緒t1鎖住了o2");

                               }

                     }

            }

if("t2".equals(name)){

synchronized(o2){

                               System.out.println("執行緒t2鎖住了o2");

synchronized(o1){

                                        System.out.println("執行緒t2鎖住了o1");

                               }

                     }

            }

   }

}