1. 程式人生 > >多線程概念、案例!

多線程概念、案例!

時間片 多次 靜態方法 xtend read 區別 方法 cat sel

1:線程的概念
進程(任務):一個正在運行的程序
進程的調度:CPU來決定什麽時候該運行哪個進程 (時間片輪流法)


1.2 線程和進程的關系
a:一個進程可以創建多個線程
b:線程必須依賴於進程而存在
c:多個線程共享進程的空間
d:進程和線程得到CPU的機會是均等的‘
1.3 為什麽要搞多線程
我們可以讓程序同時執行(並發執行)

//Java只讓我們創建線程,而不讓我們創建進程

HelloWorld.java
javac HelloWorld.java
java HelloWorld --->JVM 啟動進程
Run Application --->JVM 啟動進程

//一個進程中至少要有一個線程
main方法 被稱為 主線程
2: 線程的創建方式
Thread 類
方式1:繼承Thread類
1:自定義一個類,繼承Thread類
2:重寫Thread類的run方法
3:創建自定義類對象
4:讓自定義類對象調用start方法,啟動線程


class MyThread extends Thread{
public void run(){
//在此寫你線程要執行的代碼(木馬查殺)
}
}
//-----------------
MyThread mt = new MyThread();
mt.start(); //啟動線程----->系統會自動調用run方法

2.2 線程中的小方法
public static void sleep(long millis)//線程執行到該語句,就會休眠---》讓出CPU
public static void yield() // 線程的禮讓 線程執行到該語句 線程會將CPU的執行權主動讓出
// 讓線程執行的更加均勻
public final void setPriority(int newPriority) //設置線程的優先級


創建線程的方式二:實現接口Runnable
步驟 :
1:自定義類實現Runnable接口
2:重寫run方法
3: 創建自定義對象
4:創建Thread類對象,並將自定義類對象作為參數傳入Thread類
5: 通過Thread類對象調用start方法啟動線程

class MyRunnable implements Runnable
{
public void run(){
//線程要執行的內容
}
}

//----------------
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();//啟動線程,系統會自動執行MyRunnable中的run方法

3: 線程的同步(線程的安全)
a:同一張票被賣了多次
b:出現了負票問題

線程的同步有三種實現方法:
a: 同步代碼塊
b: 同步方法
c: Lock鎖

3.1 同步代碼塊
synchronized (鎖對象) //可以是任何一個對象,必須保證線程共享這個對象
{
//存放你要加鎖的代碼
}
3.2 同步方法
//同步方法的鎖對象是this
//靜態方法的鎖對象是類的Class對象
public synchronized void sellTickets(){
}

3.3 兩者的區別
synchronized (鎖對象)
{
xxxxx
yyyyy
zzzzz
sssss
ttttt
}

public synchronized void sellTickets(){
xxxxx
yyyyy
zzzzz
sssss
ttttt
}


//---------------
public void method(){
xxxxx
yyyyy
synchronized (鎖對象) {
zzzzz
sssss
ttttt
}
}
//同步方法,用戶不能只指定鎖對象,默認都是this
//同步代碼塊,自己可以指定鎖對象,鎖對象可以是任何對象,只要線程共享即可

3.4 Lock鎖
Lock:
ReentrantLock
lock(); 加鎖
unlock(); 解鎖

1:創建ReentrantLock對象
2:在適當的地方加鎖
lock()
2:在適當的地方解鎖
unlock();

多線程概念、案例!