###1、首先來了解一下線程和進程的概念
進程的概念:
進程是操作系統資源管理的最小單位,進程是一個動態的實體,他是程序的一次執行過程。也叫作一個控制單元
線程的概念:
線程是進程中獨立的控制單元,線程控制著進程的執行。一個進程中至少有一個線程。
java VM(java虛擬機)在運行時啟動了一個進程---java.exe
該進程在執行時,至少有一個線程在控制著java程序的運行,并且這個線程存在于java的main函數中,
該線程稱之為java的主線程。
擴展:在JVM運行時,除了main函數中的線程在運行外,還有JVM中負責java垃圾回收的線程在運行。因此,java不是單線程運行程序。

### 實現多線程的第一種方式(單繼承方式):
1.繼承自Thread類實現多線程
步驟:
1)創建一個類繼承Thread
2)覆寫run方法
目的是存放多線程要執行的自定義代碼。
3)在main函數中創建該類
4)使用start()方法調用該線程(start方法有兩種含義:1,啟動多線程。2,調用線程中的run方法)
~~~
public class Day1{
public static void main(String args[]){
DemoThread dt = new DemoThread();
dt.start(); //用于啟動線程,并自動執行run方法。
dt.run(); //只是單純的對象調用,在主線程中執行,并不開啟子線程。
for(int i=0;i<50;i++){
System.out.println("main run-----"+i);
}
}
}
class DemoThread extends Thread{
public void run(){
for(int i=0;i<50;i++)
System.out.println("demo run-----"+i);
}
}
~~~
我們發現運行同一個程序,他們的運行結果卻不太相同,
這是多個線程都獲取系統的CPU資源,CPU執行到誰,誰就運行。
CPU在某一時刻只能執行一個程序(多核除外),CPU在做著快速的切換,以達到看上去是在同時執行的效果。
我們通過打印輸出,來判斷到底是哪一個線程搶占到了CPU的資源。
Thread類的意義-----用于描述線程。
該類定義了一個功能,用于存儲線程要運行的代碼,而這個存儲功能就是run方法。
run方法中存儲線程要執行的 自定義代碼塊。
而start方法用于啟動線程,并自動執行run方法。
Thread類中提供的常用的方法:
static Thread currentThread: 返回當前正在執行的線程對象的引用
String getName();返回當前線程的名稱。
當使用Thread的無參構造創建線程實例時,java虛擬機會自動為線程創建一個名字。(以Thread-編號的格式)
static void sleep(long time)? 使線程休眠time時間。
### 創建線程的第二種方式(實現Runnable接口):
實現Runnable 接口來實現多線程:
步驟:
1)創建類實現Runnable接口
2)實現Runnable接口中的run方法
3)創建Thread對象
4)將Runnable對象作為實際參數傳遞給Thread的構造方法
5)調用Thread類的start方法,自動執行Runnable對象中的run方法
~~~
public class Day1Runable{
public static void main(String args[]){
DemoRunnable dr = new DemoRunnable();
Thread t1 = new Thread(dr);
Thread t2 = new Thread(dr);
Thread t3 = new Thread(dr);
Thread t4 = new Thread(dr);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class DemoRunnable implements Runnable{
private int ticket=100;
public void run(){
while(true){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+"--售票:"+ticket--);
}
}
}
~~~
問題:繼承方式與實現方式有什么區別
1、避免了單繼承的局限性
2、多線程執行代碼位置不同:
繼承Thread類:代碼存放在Thread類的run方法中
實現Runnable類:代碼存放在Runnable接口的run方法中。