線程Thread

1 什么是線程?

? ? ? ? 線程是程序執(zhí)行流的最小單位,進程是線程的容器,一個進程可以有一個或多個線程,各個線程共享進程的內(nèi)存.進程是操作系統(tǒng)控制的最小單位,線程是CPU調度的最小單位。

? ? ? 當我們啟動一個App的時候,Android系統(tǒng)會啟動一個Linux Process,該Process包含一個Thread,稱為UI Thread或Main Thread。通常一個應用的所有組件都運行在這一個Process中,當然,你可以通過修改四大組件在Manifest.xml中的代碼塊()中的android:process屬性指定其運行在不同的process中。當一個組件在啟動的時候,如果該process已經(jīng)存在了,那么該組件就直接通過這個process被啟動起來,并且運行在這個process的UI Thread中。

1.1 Android啟動多線程的基本方法包括2種

類Thread

接口Runnable

其他方法:最終通過以上方法封裝的

1.2 線程狀態(tài)

Java中線程的狀態(tài)分為6種:

1. 初始(NEW):新創(chuàng)建了一個線程對象,但還沒有調用start()方法。

2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態(tài)籠統(tǒng)的稱為“運行”。

線程對象創(chuàng)建后,其他線程(比如main線程)調用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,等待被線程調度選中,獲取CPU的使用權,此時處于就緒狀態(tài)(ready)。就緒狀態(tài)的線程在獲得CPU時間片后變?yōu)檫\行中狀態(tài)(running)。

3.?阻塞(BLOCKED):表示線程阻塞于鎖。

4.?等待(WAITING):進入該狀態(tài)的線程需要等待其他線程做出一些特定動作(通知或中斷)。1

5.?超時等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時間后自行返回。

6. 終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢。

2 java 安全鎖類型

? ? ? ? 鎖的分類方法有很多,這里將java的鎖分為兩類 隱示鎖和顯示鎖;

? ? ? ? synchronized :因為它是由jdk內(nèi)部實現(xiàn)加鎖、解鎖,程序員無法自己處理,稱為隱式鎖,也叫內(nèi)置鎖。

? ? ? ? 一種情況 synchronized 持有 xxx.class對象鎖? 稱為類鎖。

? ? ? ? 一種情況synchronized持有一把object對象鎖? 稱為對象鎖

Lock :程序員可以自己控制 加鎖 解鎖等邏輯

實例如下:

public class Test {

? ? int i=0;

? ? /**

? ? * synchronized 持有Test.class對象鎖 -> 類鎖

? ? */

? ? public synchronized void count(){

? ? ? ? i++;

? ? ? ? System.out.println(i);

? ? }

? ? public void count2(){

? ? ? ? /**

? ? ? ? * synchronized 持有Test()對象鎖 -> 類鎖

? ? ? ? */

? ? ? ? synchronized (this){

? ? ? ? ? ? i++;

? ? ? ? ? ? System.out.println(i);

? ? ? ? }

? ? }

? ? public void count3(){

? ? ? ? /**

? ? ? ? * synchronized 持有Test.class對象鎖 -> 類鎖

? ? ? ? */

? ? ? ? synchronized (Test.class){

? ? ? ? ? ? i++;

? ? ? ? ? ? System.out.println(i);

? ? ? ? }

? ? }

? ? private Object object=new Object();//這里作為一個鎖

? ? public void count4(){

? ? ? ? /**

? ? ? ? * synchronized 持有Object的對象鎖 -> 對象鎖

? ? ? ? */

? ? ? ? synchronized (object){

? ? ? ? ? ? i++;

? ? ? ? ? ? System.out.println(i);

? ? ? ? }

? ? }

? ? // 聲明一個顯示鎖之可重入鎖? new 可重入鎖

? ? // 非公平鎖

? ? private Lock lock = new ReentrantLock();

? ? public void count5(){

? ? ? ? lock.lock();

? ? ? ? try{

? ? ? ? ? ? i++;

? ? ? ? }finally {

? ? ? ? ? ? System.out.println(i);

? ? ? ? ? ? lock.unlock();

? ? ? ? }

? ? }

? ? static class MyThread extends Thread{

? ? ? ? private Test test;

? ? ? ? public MyThread(Test test) {

? ? ? ? ? ? this.test = test;

? ? ? ? }

? ? ? ? @Override

? ? ? ? public void run() {

? ? ? ? ? ? super.run();

? ? ? ? ? ? for (int i=0;i<20000;i++){

? ? ? ? ? ? ? ? //test.count();

? ? ? ? ? ? ? ? //test.count2();

? ? ? ? ? ? ? ? //test.count3();

? ? ? ? ? ? ? ? test.count4();

? ? ? ? ? ? ? ? //test.count5();

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? public static void main(String[] args) {

? ? ? ? Test t=new Test();

? ? ? ? MyThread t1=new MyThread(t);

? ? ? ? MyThread t2=new MyThread(t);

? ? ? ? MyThread t3=new MyThread(t);

? ? ? ? t1.start();

? ? ? ? t2.start();

? ? ? ? t3.start();

? ? }

}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容