開始重新學習并發,雖然以前也沒怎么好好學........準備看java核心技術卷一來自學
so,首先,需要了解多線程和多進程之間的區別,多進程的進程數目并不由CPU數目制約,而是操作系統將CPU的時間分配給進程,
多線程則在較低的層次上擴展了多任務的概念,一個程序可以同時處理多個任務,則每個任務為一條線程。
進程和線程的本質區別:每個進程擁有自己的一整套變量,而線程則共享數據
同時,線程更輕量級,創建,撤銷一個線程比啟動新進程的開銷小很多
1.認識Thread
1.1 Thread實現了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很簡單,只有一個函數run(),是一個函數式接口
Thread的構造方法
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,我就用過前兩個,監介
接下來是Thread的常見方法
static void sleep(long millis)
void start()
void run()
static void yield()
暫停該線程,并執行其他線程
void join()
等待該線程終止
public final boolean isDaemon()
void interrupt()
向線程發送中斷請求,線程的中斷狀態被設置為true,若當前線程被一個sleep調用阻塞,那么會拋出異常
static boolean interrupted()
boolean isInterrupted()
static Thread currentThread()
Thread.State getState()
2.線程狀態
- New(新創建,但還未運行,new Thread())
- Ruunable(調用了start()方法,一個可運行的線程可能在運行也可能沒在運行,取決于操作系統給線程提供的運行時間)
- Blocked(當一個線程試圖調用一個內部的對象鎖,而該鎖被其他線程持有,則該線程進入阻塞狀態)
- Waiting(當線程調用sleep()或wait(),或者等待concurrent庫中的Lock或Condition時,就會進入等待狀態)
- Timed Waiting(當等待狀態有一個超時參數時,就是計時等待狀態)
*Terminated(1.run()方法正常退出 , 2.因為一個沒有捕獲的異常終止了run()方法)