進程:
進程是程序的一次動態執行過程,經歷從代碼加載、代碼執行到執行完畢的一個完整過程。一個應用程序就是一個進程。多進程操作系統能同時運行多個進程(程序),由於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,所以需要處理。