線程:線程是指進程內的一個執行單元,也是進程內的可調度實體. 表示程序執行的基本流程,cpu執行的基本單位java
進程:進程是一個具備獨立功能的程序關於某個數據集合的一次運行活動api
在一個進程中能夠包含若干個線程多線程
* 1.建立:在生成線程對象,並無調用該對象的start方法,這是線程處於建立窗臺併發
* 2.就緒:當調用了線程對象的start方法後,該線程就進入了就緒狀態,但此時線程調度程序尚未把該線程設置爲當前線程,此時處於就緒狀態,在線程運行以後,從等待或者睡眠中回來後,也會處於就緒狀態框架
* 3.運行:線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程進入了一個運行狀態,開始運行run方法體中的代碼異步
* 4.阻塞:線程在運行的時候被暫停,一般是爲了等待某個時間某項操做的發生以後再運行,sleep、suspend、wait等方法均可以致使阻塞(線程各個api方法如何使用?sleep和wait有什麼區別?)jvm
* 5.死亡:若是一個線程的run方法執行結束或者滴啊用stop方法後,該線程就會死亡,對於已經死亡的線程,沒法經過start進入就緒狀態!!!ide
啓動線程的惟一方法就是經過Thread類的start()實例方法,run方法只是把線程當成一個普通方法來執行,run方法執行完後,線程就進入阻塞狀態測試
start和run 的區別:spa
* 每一個線程都是經過某個特定Thread對象所對應的方法run來完成其操做的,方法run()稱爲線程體。
* 經過調用Thread類的start()方法來啓動一個線程
* 調用start方法後,線程會被放到等待隊列,等待CPU調度,並不必定立刻要開始執行,只是將這個線程置於準備狀態,而後 經過jvm,線程thread會調用run方法,執行本線程的線程體
* start用來啓動線程,真正實現多線程運行,這是無需等待run方法體代碼執行完畢,能夠直接繼續執行下面的代碼,經過調用thread類的shart方法來啓動一個線程,此時線程是就緒狀態,並無運行,而後經過此thred類調用方法run來完成其運行操做的,這裏的run方法稱爲線程體,它包含了要執行這個線程的內容,run方法運行結束,此線程終止,而後cpu再調度其餘線程
* run方法當作普通方法的方式調用,程序仍是要順序執行,要等待run方法執行完畢後,才能夠繼續執行下面的代碼,程序中只有一個主線程,這樣就沒有達到寫線程的目的
先調用start後調用run,這麼麻煩,爲了避免直接調用run?就是爲了實現多線程的優勢,沒這個start不行。
總結來講就是分時利用cpu,宏觀上看起來讓全部線程一塊兒執行,也叫併發。其實是cpu各個時間片處理不一樣的線程
1)繼承Thread類,重寫run方法,經過start啓動線程(無返回值)
2)實現runnable接口,實現run方法,經過new Thread(Runnable target).start()方法來啓動(無返回值)
3)使用ExecuterService,callback,Future實現由返回值的多線程
Executor框架是指java5中引入的一系列併發庫中與executor相關的功能類,包括Executor、Executors、ExecutorService、CompletionService、Future、Callable等。
Executor中比較重要的類和接口:
1)Executor 接口
Executor接口是Executor框架中最基礎的部分,定義了一個用戶執行Runnable的execute方法。沒有直接的實 現類,有一個重要的子接口ExecutorServices
2) ExecutorService
ExecutorService 繼承自Executor接口,定義了終止、提交任務、跟蹤任務返回結果等方法
ExecutorService 有一個子接口ScheduledExecutorService和一個抽象實現類AbstractExecutorService
3)Future表明異步任務的執行結果
4) ScheduledExecutorService 能夠安排指定時間或週期性的執行任務的ExecutorService
多線程實現以下:
控制檯輸出結果爲線程123交替輸出
package com.cm.test; /** * java中的線程狀態:建立,就緒,運行,阻塞,死亡 * 1.建立:在生成線程對象,並無調用該對象的start方法,這是線程處於建立窗臺 * 2.就緒:當調用了線程對象的start方法後,該線程就進入了就緒狀態,但此時線程調度程序尚未把該線程設置爲噹噹前線程,此時處於就緒狀態 * 在線程運行以後,從等待或者睡眠中回來後,也會處於就緒狀態 * 3.運行:線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程就進入了一個運行狀態,開始運行run方法體中的代碼 * 4.阻塞:線程在運行的時候被暫停,一般是爲了等待某個時間的發生以後再運行,sleep,suspend,wait等方法均可以致使阻塞 * 5.死亡:若是一個線程的run方法執行結束或者滴啊用stop方法後,該線程就會死亡,對於已經死亡的線程,沒法經過start進入就緒狀態 * * 實現線程的3中方式: * 1.線程1,2 實現runnable接口,重寫run方法,實例化thread和接口實現,經過start方法執行 * 2.線程3,繼承thread類 * 3.使用ExecutorService,callable,Future實現由返回結果的多線程(這次不詳細多說) * * 啓動線程的惟一方法就是經過Thread類的start()實例方法,run方法只是把線程當成一個普通方法來執行,run方法執行完後,線程就進入阻塞狀態 * * * start和run方法的區別:每一個線程都是經過某個特定Thread對象所對應的方法run來完成其操做的,方法run()稱爲線程體。 * 經過調用Thread類的start()方法來啓動一個線程 * * 調用start方法後,線程會被放到等待隊列,等待CPU調度,並不必定立刻要開始執行,只是將這個線程置於準備狀態,而後經過jvm, * 線程thrad會調用run方法,執行本線程的線程體 * * start用來啓動線程,真正實現多線程運行,這是無需等待run方法體代碼執行完畢,能夠直接繼續執行下面的代碼,經過調用thread類的shart方法來 * 啓動一個線程,此時線程是出於就緒狀態,並無運行,而後經過此thred類調用方法run來完成其運行操做的,這裏的run方法稱爲線程體,它包含了要執行這個線程 * 的內容,run方法運行結束,此線程終止,而後cpu再調度其餘線程 * run方法當作普通方法的方式調用,程序仍是要要順序執行,要等待run方法執行完畢後,才能夠繼續執行下面的代碼,程序中只有一個主線程,這樣就沒有達到寫線程的目的 * * * 多線程的概念:總結來講就是分時利用cpu,宏觀上看起來讓全部線程一塊兒執行,也叫併發。其實是cpu各個時間片處理不一樣的線程 * @author admin * */ public class MultiThread { public static void main(String[] args) { Thread thread1 = new Thread(new Runnable1());// Thread(Runnable target) Thread thread2 = new Thread(new Runnable2()); Runnable3 r3 = new Runnable3();// 繼承runnable類無需再實例化thread類,實例化runnable後直接調用start方法 thread1.start(); thread2.start(); r3.start(); } } class Runnable1 implements Runnable {// 實現runnable接口,jdk知道是多線程 @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println("進入線程runnable1運行---------"); } } } class Runnable2 implements Runnable { @Override public void run() { for (int i = 0; i < 10000; i++) { System.out.println("進入線程runnable2運行---------"); } } } class Runnable3 extends Thread { public void run() { for (int i = 0; i < 10000; i++) { System.out.println("進入線程runnable3運行--------"); } } }