多線程

1、線程:就是進程中的一個獨立的控制單元,線程在控制着進程的執行。

   一個進程中至少有一個線程,當一個進程中出現多個線程時,就稱這個應用程序是多線程應用程序,每個線程在棧區中都一般常見的Java應用程序都是單線程的。比如,用java命令運行一個最簡單的HelloWorld的Java應用程序

時,就啓動了一個JVM進程,JVM找到程序程序的入口點main(),然後運行main()方法,這樣就產生了

   一個線程,這個線程稱之爲主線程。當main方法結束後,主線程運行完成。JVM進程也隨即退出 。

2、創建線程的方式
(1)第一種方式:繼承Thread類。
步驟:
A.定義類繼承Thread。
B.複寫Thread類中的run方法。目的:將自定義代碼存儲在run方法。讓線程運行。
C.調用線程的start方法,該方法兩個作用:啓動線程,調用run方法
(2)創建線程的第二種方式:實現Runable接口
步驟:
A.定義類實現Runnable接口
B.覆蓋Runnable接口中的run方法。將線程要運行的代碼存放在該run方法中。
C.通過Thread類建立線程對象。
D.將Runnable接口的子類對象作爲實際參數傳遞給Thread類的構造函數。
E.調用Thread類的start方法開啓線程並調用Runnable接口子類的run方法。
兩種方法創建線程及線程的狀態
//自定義類繼承Thread類
class MyThreadEx extends Thread{
String name;
//定義構造函數,給線程初始化名稱
public MyThreadEx(String name) {
super(name);
}
@Override//重寫run方法,存線程代碼
public void run(){
for (int i = 0; i < 100; i++) {
//線程執行中
System.out.println(Thread.currentThread().getName()+"......"+i);
}
}//方法結束,線程消亡
}
//自定義類實現接口
class MyThreadImpl implements Runnable{

@Override//重寫run方法,存線程代碼
public void run() {
for (int i = 0; i < 100; i++) {
//線程執行中
System.out.println(Thread.currentThread().getName()+"******"+i);
}
}
} //方法結束,線程消亡
public class MyThreadImplTest {

public static void main(String[] args) {
//創建子類對象,線程創建
MyThreadEx mte = new MyThreadEx("繼承方式線程");
//調用start()方法,又jvm調用run方法,線程就緒中,爭搶cup執行權
mte.start();
//創建接口子類對象,線程創建
MyThreadImpl mti = new MyThreadImpl();
//創建Thread 類對象,並傳入接口子類對象
Thread t = new Thread(mti,"接口方式線程");
//調用start()方法,又jvm調用run方法,線程就緒中,爭搶cup執行權
t.start();
}

}

3、線程的同步
1:產生線程安全的原因
A:多個線程訪問出現延遲。
B:線程訪問的隨機性

注:線程安全問題在理想狀態下,不容易出現,但一旦出現對軟件的影響是非常大的。
2:如果判斷一個線程程序有沒有安全問題呢?
A:多個線程操作共享數據
B:這個操作是分多條語句執行的。
3:解決線程安全問題的方式
A:同步代碼塊
格式:
synchronized(對象)
{
//需要被同步的代碼
}
B:同步方法
當一個方法的方法體都被同步代碼塊給包圍起來了,我們就可以使用另外一種方式來表示。就是同步方法。
格式在方法聲明上加同步關鍵字synchronized

4、線程調度的模式有兩種:

分別是分時調度和搶佔式調度。分時調度是所有線程輪流獲得CPU使用權,並平均分配每個線程佔用CPU的時間;

搶佔式調度是根據線程的優先級別來獲取CPU的使用權。而JVM的線程調度模式採用了搶佔式模式。

多線程還有一種“併發執行機制”

所謂的“併發執行”並不是真正意義上的同時執行

例如:

public static void main(String[] args)
{
Runnable mt1=new MyThread();
Runnable mt2=new MyThread();
new Thread(mt1).start();
new Thread(mt2).start();
}

class MyThread implements Runnable
{
public void run()
{for(int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+":"+"i");
}
}

這裏並行是指線程輪流獲取CPU的使用權,並平均分配每個線程佔用CPU的時間。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章