一. 創建線程方法包括:
1. 繼承Thread創建後調用start()方法啓動;
2. 實現runnable接口後作爲Thread的target創建,調用Thread的start()方法啓動;
3.實現Callable<>接口作爲Future<>的target創建,調用Future<>的Start()方法啓動線程,後續可以調用get()方法獲取Callable<>返回值(該方法會阻塞當前線程)
二. 控制線程:
1. Thread的join()方法可以讓當前線程阻塞直被join()的線程執行完畢,支持join(long millis)指定最大等待時間;
2. 調用Thread的setDaemon(true)可以將線程設置爲後臺線程,後臺線程將在所有非後臺線程死亡後自動死亡;
3. 調用 Thread的sleep(long millis)可以讓當前線程被阻塞指定時間長度;
4. 調用Thread的yield()方法會將當前線程轉入就緒(非阻塞)狀態,線程調度器會重新調度(該線程也有可能被調度器重啓啓動)5. 調用Thread的setPriority(int newPriority)和getPriority()方法可以設置和獲取指定線程的優先級,高優先級線程有較多的機會被執行。
三. 線程同步:
1. 使用synchronized(obj){...}可以同步代碼塊,obj就是同步監視器;
2. 使用synchronized可以同步非static方法,無須顯式指定監視器,採用this作爲監視器;
3. 同步方法和同步代碼塊執行完畢、拋出異常、執行了同步檢視對象的wait()會釋放同步監視器,調用sleep()和yield()不會釋放同步監視器;
4. 使用Lock可以實現比synchronized更靈活的同步控制,常用的是ReentrantLock類,使用該類的lock()和unlock()方法實現;
四. 線程通信
1. wait() / notify() / notifyAll(),用於使用了相同監視對象的線程進行同步。意義分別爲導致當前線程等待(可設置最長等待時間),隨機喚醒單個等待線程,喚醒所有等待線程,要注意對於使用synchronized修飾的同步方法,this就是同步監視器,可以直接調用這幾個方法,如果是synchronized修飾同步代碼塊,同步監視器是synchronized括號裏面的對象,必須使用這個對象的這幾個方法。注意一點這幾個方法只是程序阻塞和繼續,跟synchronized和lock控制的線程阻塞,死鎖等有區別;
2. Condition控制線程通信,對於使用lock而非synchronized來保證同步的程序,使用Lock對象的new Condition()方法可以獲取Condition對象,該對象有await() / signal() / signalAll() 方法,功能和上面的 wait() / notify() / notifyAll()類似
3. 阻塞隊列(BlockingQueue)控制線程隊列,BlockingQueue主要用來控制線程同步,實現類有ArrayBlockingQueue, LinkedBlockingQueue等,提供put(E e)和take()兩個方法控制線程同步,前者嘗試把元素放入阻塞隊列,如果隊列已滿(初始化隊列時需要指定隊列容量),則阻塞當前線程;後者嘗試從隊列中取出頭部元素,如果當前隊列爲空,則阻塞當前線程。