java多線程

一、 
進程: 
進程是程序的一次動態執行過程,經歷從代碼加載、代碼執行到執行完畢的一個完整過程。一個應用程序就是一個進程。多進程操作系統能同時運行多個進程(程序),由於CPU具備分時機制,所以每個進程都能循環獲得自己的CPU時間片。 


線程: 
每個Java程序都至少有一個線程——主線程。當一個Java程序啓動時,JVM會創建主線程,並且在該線程中調用程序的main()方法。 
1、單線程: 
之前接觸的都是單線程程序,單線程的特點是,被調用的方法執行完畢後當前方法纔可能完成,前一個方法完成後才進行下一個方法。這是一種順序調用。 
2、多線程: 
當程序同時用多個線程調用不同方法時,並不是像單線程一樣的順序調用,而是啓動獨立的線程之後立刻返回,各線程運行從run()方法開始,當run()結束後線程運行結束。 
3、線程的優點——並行、省時。 
單核CPU是通過暫停與切換實現多線程的。 


進程與線程的區別: 
(1)一個應用程序就是一個進程,而線程是一個進程內部的多個運行單位。 
(2)多進程的內部數據和狀態都是完全獨立的,而多線程是共享一塊內存空間和一組系統資源(在同一進程內),在程序內部可以相互調用。 
(3)線程本身的數據通常只有寄存器數據,以及一個程序執行時使用的堆棧,所以線程的切換比進程切換的負擔小。 




二、 
每個線程對象都繼承了java.lang包中的Thread類,或implements了Runnable接口類。 
線程的啓動:start()方法; 
線程的運行:run()方法。 


java多線程的實現 

        1、繼承Thread類實現線程。重寫Thread類的run()方法

public class ThreadDemo extends Thread{  
    //要統計的磁盤路徑  
    private String path;  
  
    //構造方法  
    public ThreadDemo(String path){  
        this.path = path;  
    }  
          
    //主方法  
    public static void main(String[] args){  
        //得到根目錄  
        File[] root = File.listRoots();  
        for(int i=0;i<root.length;i++){  
            //創建線程對象  
            ThreadDemo td = new ThreadDemo(root[i].getAbsolutePath());  
            td.start();  
        }         
    }  
  
    //重寫run方法  
    public void run(){  
        long start = System.currentTimeMillis();  
        System.out.println("開始時間:"+start);  
        int num = countFile(path);  
        long end = System.currentTimeMillis();  
        System.out.println("結束時間:"+end);  
        System.out.println(path+"統計共有"+num+"個文件!");  
    }  
      
    //統計文件數目的方法  
    public int countFile(String path){  
        int count = 0;  
        File file = new File(path);  
        //得到該目錄下的所有文件  
        File[] subFile = file.listFiles();  
        //如果該目錄爲空或  
        if(null==subFile||subFile.length==0){  
            return count;  
        }  
        for(int i=0;i<subFile.length;i++){  
            if(subFile[i].isDirectory()){  
                count+=countFile(subFile[i].getAbsolutePath());  
            }else if(subFile[i].isFile()){  
                count++;  
            }  
        }         
        return count;  
    }     
}  

 2、實現Runnable接口創建線程 
Runnable接口只有一個run()方法沒有start()方法,所以在使用Runnable接口的實現類創建線程時,啓動線程要構造一個Thread對象,並調用它的start()方法來啓動線程。 
  
        3、使用匿名內部類創建線程 
在實例化Runnable方法時使用匿名內部類重寫run()方法。然後再用Thread對象的start()方法啓動線程。 


如果run()方法要用到while(true){....}時,會發現CPU的佔用率是100%。這時就要讓線程隔一段時間暫停一下。在線程運行時,調用一個靜態方法sleep(long time),可以讓線程暫停time時間後再開始運行,暫停的時間以毫秒計。Thread.sleep(long time)只會讓線程暫停(掛起),不是停止也不是退出。當線程在sleep時如果JVM或其他線程強行終止這個線程,sleep方法會拋出線程中斷異常InterruptedException,所以需要處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章