1.線程程序的差別
具體例子: 打開網易雲,相當于打開一個程序, 點選播放音樂, 就相當于建立了一個線程, 點選下載下傳, 相當于又建立了一個線程, 我們再去打開QQ, 就是又打開了一個程序, 總結: 線程是程序的子關系。
具體對比:
程序 | 線程 |
---|---|
資源配置設定的最小機關 | 系統排程的最小機關 |
有獨立空間,互相之間是隔離的 | 沒有獨立空間, 同一個程序下的線程共享記憶體空間 |
一個程序有多個線程 | 一個線程隸屬于一個程序 |
建立時消耗大,打開一個應用當然大 | 消耗小, 讓作業系統去fork()一個線程 |
2.線程阻塞和等待的差別_什麼導緻線程阻塞?
阻塞: 指的是暫停一個線程的執行以等待某個條件發生(如某資源就緒)
調用sleep()方法後就會處于阻塞狀态,不會釋放cpu資源, 也不會釋放鎖,等時間到了, 又進入就緒狀态。
等待: 和阻塞類似, 但是它會釋放CPU, 釋放鎖, 調用wait()方法,等待用notify()和notifyAll()方法去喚醒它, 然後進入等待序列。
3.同步異步的差別
同步是所有的操作都做完,才傳回給使用者結果;即寫完資料庫之後,再響應使用者,使用者體驗不好。而異步不用等所有操作都做完,就相應使用者請求;即先響應使用者請求,然後慢慢去寫資料庫,使用者體驗較好。”
4.JAVA建立線程的四種方式
繼承Thread類建立線程
實作Runnable接口建立線程
使用Callable和Future建立線程
使用線程池例如用Executor架構
callable和future
public static class MyCallAble implements Callable{
int i = 0;
@Override
public Object call() throws Exception {
System.out.println(Thread.currentThread().getName() + ": i = " + (i++));
return i;
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Callable callable = new MyCallAble();
for (int i = 0; i < 1000; i++) {
FutureTask futureTask = new FutureTask(callable);
new Thread(futureTask, "子線程" + i).run();
System.out.println(futureTask.get());
}
}
線程池的方法, 這裡是線程池的構造函數
public ThreadPoolExecutor(int corePoolSize, //核心線程數
int maximumPoolSize, //線程池最大線程數
long keepAliveTime, //線程池空閑時線程的存活時長;
TimeUnit unit,//線程存活時長大機關,結合上個參數使用;
BlockingQueue<Runnable> workQueue) { //存放任務的隊列,使用的是阻塞隊列;
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
除了上面5個以外, 還有兩個參數
threadFactory:線程池建立線程的工廠;
handler:在隊列(workQueue)和線程池達到最大線程數(maximumPoolSize)均滿時仍有任務的情況下的處理方式;
5.線程池的相關知識
線程池處理流程
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxklaOlXTE5UMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2YjM0ITMzATMzAzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
4種拒絕政策
1.當觸發拒絕政策時,隻要線程池沒有關閉,就由送出任務的目前線程處理
2.當觸發拒絕政策時,直接抛出拒絕執行的異常,中止政策的意思也就是打斷目前執行流程
3.直接靜悄悄的丢棄這個任務,不觸發任何動作
4.如果線程池未關閉,就彈出隊列頭部的元素,然後嘗試執行
6.sleep(), wait(), jion(), yield()
sleep(): 進入阻塞狀态, 但是不釋放鎖和cpu資源, 等待時間到了又進入就緒狀态
wait(): 釋放鎖和cpu資源, 等待notify和notifyAll喚醒進入等待隊列。
jion(): 如t.jion(), 代表主線程将執行權交給t, t執行完了以後在繼續執行
yield():釋放cpu但不釋放執行權。