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();
? ? }
}