開始重新學(xué)習(xí)并發(fā)岸浑,雖然以前也沒怎么好好學(xué)........準(zhǔn)備看java核心技術(shù)卷一來自學(xué)
so,首先侣夷,需要了解多線程和多進(jìn)程之間的區(qū)別最仑,多進(jìn)程的進(jìn)程數(shù)目并不由CPU數(shù)目制約缴渊,而是操作系統(tǒng)將CPU的時間分配給進(jìn)程赏壹,
多線程則在較低的層次上擴(kuò)展了多任務(wù)的概念,一個程序可以同時處理多個任務(wù)衔沼,則每個任務(wù)為一條線程蝌借。
進(jìn)程和線程的本質(zhì)區(qū)別:每個進(jìn)程擁有自己的一整套變量,而線程則共享數(shù)據(jù)
同時指蚁,線程更輕量級菩佑,創(chuàng)建,撤銷一個線程比啟動新進(jìn)程的開銷小很多
1.認(rèn)識Thread
1.1 Thread實現(xiàn)了Runnable接口
Runnable
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
Runnable很簡單凝化,只有一個函數(shù)run()稍坯,是一個函數(shù)式接口
Thread的構(gòu)造方法
Thread()
分配新的 Thread 對象。
Thread(Runnable target)
分配新的 Thread 對象搓劫。
Thread(Runnable target, String name)
分配新的 Thread 對象瞧哟。
Thread(String name)
分配新的 Thread 對象。
Thread(ThreadGroup group, Runnable target)
分配新的 Thread 對象枪向。
Thread(ThreadGroup group, Runnable target, String name)
分配新的 Thread 對象勤揩,以便將 target 作為其運行對象,將指定的 name 作為其名稱秘蛔,并作為 group 所引用的線程組的一員陨亡。
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
分配新的 Thread 對象,以便將 target 作為其運行對象深员,將指定的 name 作為其名稱数苫,作為 group 所引用的線程組的一員,并具有指定的堆棧大小辨液。
Thread(ThreadGroup group, String name)
分配新的 Thread 對象虐急。
emmm,我就用過前兩個,監(jiān)介
接下來是Thread的常見方法
static void sleep(long millis)
void start()
void run()
static void yield()
暫停該線程滔迈,并執(zhí)行其他線程
void join()
等待該線程終止
public final boolean isDaemon()
void interrupt()
向線程發(fā)送中斷請求止吁,線程的中斷狀態(tài)被設(shè)置為true被辑,若當(dāng)前線程被一個sleep調(diào)用阻塞,那么會拋出異常
static boolean interrupted()
boolean isInterrupted()
static Thread currentThread()
Thread.State getState()
2.線程狀態(tài)
- New(新創(chuàng)建敬惦,但還未運行盼理,new Thread())
- Ruunable(調(diào)用了start()方法,一個可運行的線程可能在運行也可能沒在運行俄删,取決于操作系統(tǒng)給線程提供的運行時間)
- Blocked(當(dāng)一個線程試圖調(diào)用一個內(nèi)部的對象鎖宏怔,而該鎖被其他線程持有,則該線程進(jìn)入阻塞狀態(tài))
- Waiting(當(dāng)線程調(diào)用sleep()或wait()畴椰,或者等待concurrent庫中的Lock或Condition時臊诊,就會進(jìn)入等待狀態(tài))
- Timed Waiting(當(dāng)?shù)却隣顟B(tài)有一個超時參數(shù)時,就是計時等待狀態(tài))
*Terminated(1.run()方法正常退出 , 2.因為一個沒有捕獲的異常終止了run()方法)