說道線程,首先我們要先知道什麼是進程。
1.什麼是進程?
進程:說白了就是一個正在執行的程序。好比你經常玩的LOL,經常編碼用的eclipse等都是一個進程。
在每一個進程中,都有一個控制單元。
2.什麼是線程?
線程:其實就是進程中的每一個控制單元。也就是說線程控制着進程的執行順序。
打個比方,好比一個服裝店(進程)只有一間試衣間(一個線程),
但這個時候同時有很多顧客,但這個時候每次只能有一個顧客能進入試衣間試衣服。
3.創建線程有幾種辦法?
a.extends Thread類。。(Thread的底層其實也是Ruannable接口)
b.implements Runnable這個接口。
記住:(1)無論是繼承還是實現,都要重寫裏面的run方法。最後調用start方法來啓動線程。
(2)實現Runnable接口後,在調用的時候要先通過Thread類建立對象,然後再調用start()方法。
Ticket t1 = new Ticket();
Thread t = new Thread(t1);
4.線程在什麼時候會被啓動?
在JVM啓動的時候首先創建了一個java.exe的進程,這個進程中至少有一個線程,這個線程存放在main方法。當程序運行的時候,線程被調用,也就是說main方法執行的時候
裏面定義的線程和主線程會被調用,當結束的時候GC(垃圾回收)線程也會被調用。(這個時候也能被稱爲多線程的運行)。
public static void main(String[] args) {
Test t1 = new Test("one");
Test t2 = new Test("two");
t1.start();
t2.start();
for(int i =0;i<50;i++){
System.out.println("main ---- "+i);
}
}
}
class Test extends Thread{
public Test(String name){
super(name);
}
@Override
public void run() {
for(int i =0;i<50;i++){
System.out.println(this.getName()+"---- "+i);
}
}
運行的結果:線程是交替執行的,不是執行完一個線程再去執行另一個線程的,而且每次執行的結果也是不同的。
注意:這裏在執行線程的時候,是調用線程中的start()方法來執行線程的,而不是調用被重寫的run方法來執行線程的。(這裏你可以調用run()方法來看看結果)
5.線程執行的五個步驟:
6.如何解決多線程中的線程執行順序的問題
給用到線程的地方加一個同步機制,也就是 synchronized關鍵字。
有兩種方式加synchronized關鍵字,
(1)是在run()裏面在需要被用到線程的地方加上關鍵字。以購票系統來說吧,多個人想買票,這個票就是要被多個人購買(這就是多線程的地方)。
public void run() {
while(true){
synchronized(this){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"----sale:"+ticket- -);
}
}
}
注意:如果要被synchronized關鍵字修飾的方法中有static關鍵字,那麼這個方法中synchronized(當前對象名.class)
這麼寫,是因爲 靜態進內存時,內存中沒有本類對象,但是一定有該類對應的字節碼文件對象,類名.class。
(2)是加在run()方法上,但是這種方式延緩執行時間。
public synchronized void run()