思維導圖如下
Thread.png
進程是程序的一次動態執行過程,它需要經歷從代碼加載,代碼執行到執行完畢的一個完整的過程,這個過程也是進程本身從產生,發展到最終消亡的過程。多進程操作系統能同時達運行多個進程(程序),由于 CPU 具備分時機制,所以每個進程都能循環獲得自己的CPU 時間片。由于 CPU 執行速度非常快,使得所有程序好像是在同時運行一樣。
多線程是實現并發機制的一種有效手段。進程和線程一樣,都是實現并發的一個基本單位。線程是比進程更小的執行單位,線程是進程的基礎之上進行進一步的劃分。所謂多線程是指一個進程在執行過程中可以產生多個更小的程序單元,這些更小的單元稱為線程,這些線程可以同時存在,同時運行,一個進程可能包含多個同時執行的線程。
在 Java 中實現多線程有兩種手段,一種是繼承 Thread 類,另一種就是實現 Runnable 接口。
Thread 類和 Runnable 接口之間在使用上也是有區別的,如果一個類繼承 Thread類,則不適合于多個線程共享資源,而實現了 Runnable 接口,就可以方便的實現資源的共享。
一個多線程的程序如果是通過 Runnable 接口實現的,則意味著類中的屬性被多個線程共享,那么這樣就會造成一種問題,如果這多個線程要操作同一個資源時就有可能出現資源同步問題。
解決方法:
同步代碼塊
synchronized(同步對象){
需要同步的代碼
}
實例代碼如下:
class MyThread implements Runnable{
private int ticket = 5 ; // 假設一共有5張票
public void run(){
for(int i=0;i<100;i++){
synchronized(this){ // 要對當前對象進行同步
if(ticket>0){ // 還有票
try{
Thread.sleep(300) ; // 加入延遲
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("賣票:ticket = " + ticket-- );
}
}
}
}
};
public class SyncDemo02{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定義線程對象
Thread t1 = new Thread(mt) ; // 定義Thread對象
Thread t2 = new Thread(mt) ; // 定義Thread對象
Thread t3 = new Thread(mt) ; // 定義Thread對象
t1.start() ;
t2.start() ;
t3.start() ;
}
};
同步方法
synchronized 方法返回值 方法名稱(參數列表){
}
class MyThread implements Runnable{
private int ticket = 5 ; // 假設一共有5張票
public void run(){
for(int i=0;i<100;i++){
this.sale() ; // 調用同步方法
}
}
public synchronized void sale(){ // 聲明同步方法
if(ticket>0){ // 還有票
try{
Thread.sleep(300) ; // 加入延遲
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("賣票:ticket = " + ticket-- );
}
}
};
public class SyncDemo03{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定義線程對象
Thread t1 = new Thread(mt) ; // 定義Thread對象
Thread t2 = new Thread(mt) ; // 定義Thread對象
Thread t3 = new Thread(mt) ; // 定義Thread對象
t1.start() ;
t2.start() ;
t3.start() ;
}
};
其實就是在實現了Runnable接口的類中的run方法中寫代碼,然后new一個Thread,用Thread的start方法來啟動另外的線程去執行run方法中的代碼
參考文章
Java多線程看這一篇就足夠了
-------------------------------------------------------------------------
android開發藝術中關于HandlerThread的介紹
HandlerThread的run方法是一個無限循環,因此當明確不需要再使用Handler時,可以通過它的quit或者quitSafely方法來終止線程的執行。代碼如下所示:
HandlerThread handlerThread = new HandlerThread("我是HandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {//創建Handler對象時,如果添加了Loop參數,那么Handler將被創建在Loop所在的線程中
@Override
public void handleMessage(Message msg) {
//這個方法是運行在 handler-thread 線程中的 ,可以執行耗時操作
switch (msg.what) {
case 0:
Log.d("CeShi",Thread.currentThread().getName()+ ":收到了");
break;
default:
break;
}
}
};
handler.sendEmptyMessage(0);//在主線程給handler發送消息
/*輸出結果為:
05-24 18:29:57.487 32249-32266/? D/CeShi: 我是HandlerThread:收到了*/