一、什麼是程式、程序(鋪墊)
程式的定義:程式它以某些程式設計語言編寫,運作于某種目标結構體系上。打個比方,程式就如同以英語(程式設計語言)寫作的文章,要讓一個懂得英語的人(編譯器)同時也會閱讀這篇文章的人(結構體系)來閱讀、了解、标記這篇文章。(程式包括我們生活中QQ、微信、java實作的畫圖闆、五子棋等)
程式儲存地點:磁盤。
Java程式的内容:(算法、資料、代碼、資源檔案等組成的。)
- package語句,該部分至多隻有一句,必須放在源程式的第一句。
- import語句,該部分可以有若幹import語句或者沒有,必須放在所有的類定義之前。
- public class (類名){},公共類定義部分,至多隻有一個公共類的定義,Java語言規定該Java源程式的檔案名必須與該公共類名完全一緻。
- public static void main(String [] )args{} 主函數,在公共類中定義。
程序的定義:是程式的一次動态執行,它對應着從代碼加載,執行至執行完畢的一個完整的過程,是一個動态的實體,它有自己的生命周期。它因建立而産生,因排程而運作,因等待資源或事件而被處于等待狀态,因完成任務而被撤消。簡單地說,将程式運作起來後,此時就會是一個程序。
因為硬體資源執行效率是有限的,在一個作業系統中能開啟的程序數是有限的。
程序的儲存地點:記憶體
二、什麼是線程
線程的定義:可以了解為程序的多條執行線索,每條線索又對應着各自獨立的生命周期。線程是程序中獨立運作的機關。線程在執行時将線程運作時所需的資料儲存在高速緩存中,在CPU中儲存記憶體資料,這樣的儲存方式使線程執行速度更快。
通常我們說CPU是多少核多少線程的就是說在你的電腦上能同一時間執行多少個線程。超級計算機、雲計算等從粗淺的方面了解就是線程數量足夠多。另外,我們可以将線程形象的比喻為交通工具,而CPU就是馬路。
線程的執行地點:CPU
線程的生命周期:建立、啟動、執行、暫停、等待、休眠、停止。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6lDbiZHbHRGa4JjY6xmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL5YjN1QzMwADM5AzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
三、什麼是多線程
在你的程序中同時有多個獨立的運作機關,這程序就是一個多線程的程序(程式)。使用多線程就是最大限度的利用硬體資源來提升程式的執行效率。
像我們之前說的作業系統中開啟的程序數是有限的,在一個程序中也不可以開啟N個線程,硬體資源限制執行效率。
四、Java實作多線程的方法
1、Runnable接口
接口是不能直接定義對象的,是以我們需要建立一個類來實作Runnable接口,同時重寫接口中的抽象方法。
public class run implements Runnable{
public int id=0;
public static void main(String [] args){
int id=0;
run a=new run();
Thread t=new Thread(a);
t.start(); }
@Override
public void run() {
id++;
System.out.println("id = "+id); }
}
run方法中是線程的運作方法(線程要執行的任務),當run結束後,線程也就結束了。
2、Thread類
Thread類是Runnable接口的子類,其中包括
start() 線程的啟動方法,如果你想要JVM把你的這個類當做是一個線程,那你就必須要使用 start()方法來啟動線程。
run() 線程的運作方法
sleep() 休眠方法。
public class THR extends Thread{
public int id=0;
public static void main(String [] args){
THR t=new THR();
t.start(); }
public void run(){
while(id<20){
id++;
System.out.println(Thread.currentThread()+" id = "+id);
//CPU速度很快,我們在這裡設定休眠,以毫秒為機關,sleep()隻能在啟動之後進行,是以在這裡要處理異常情況。
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
}
3、多線程執行個體
首先我們要明确,在每個Java程式中至少擁有一個線程,這個線程是JVM給你建立的,然後啟動線程調用main函數,根據main函數中的代碼,逐行調用。
另外,多個線程同時控制一個對象時會出現線程的互斥控制情況。
多個線程同時操作某一對象時,一個線程對該對象的操作可能會改變其狀态,而該狀态會影響
另一線程對該對象的真正結果.
這個例子我們在太多的文檔中可以看到,就象兩個操售票員同時售出同一張票一樣.
而且一旦一個線程達到終止條件時,run方法便結束了,是以其他線程也同時結束。
public class main extends Thread{
public Tread_ demo;
//構造方法
public main(Tread_ demo){
this.demo=demo; }
public void run() {
while(demo.a<20){
demo.print();
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Tread_ demo=new Tread_(1);
for(int i=0;i<10;i++){
main m=new main(demo);
Thread t=new Thread(m);
t.start();
}
}
}
Tread_類:
public class Tread_ {
public int a=1;
public Tread_(int a){
this.a=a; }
public void print(){
a++;
System.out.println(Thread.currentThread() +"————————a="+a);
}
}
結果: