程序(program)
是為完成制定任務,用某種語言編寫的一組指令的集合.簡單的話說:就是我們寫的代碼.
?
進程
1.進程是指進行中的程序,比如我們使用QQ,就啟動了一個進程,操作系統就會為該進程分配內存空間,當我們使用迅雷,又啟動了一個進程,操作系統將為迅雷分配新的內存空間.
2、進程是程序的一次執經過程,或是正在進行的一個程序,是動態過程,有它自身的產生,存在和消亡的過程.
?
線程
1.線程由進程/線程創建,是進程的一個實體.
2.一個進程可以擁有多個線程.
i.單線程:同一個時刻,只允許執行一個線程
ii.多線程:同一個時刻,可以執行多個線程,比如,一個QQ進程,可以同時打開多個聊天窗口,一個迅雷進程,可以同時下載多個文件.
3.并發:同一時刻,兩個任務發替執行,造成一種"貌似同時"的銷覺,簡單的說,單核CPU實現的多任務是并發
4.并行:同一個時刻,多個任務同時執行,多核CPU可以實現并行.
?
創建線程的兩種方式
在iava中線程使用有兩種方法.
1.繼承Thread類,重寫run方法
?
2.實現Runnable接口,重寫run方法.
使用這兩個線程類
?
示意圖:
?
實例并使用JConsole查看線程:
?
tips:控制臺中輸入jconsole
?
?
?
為什么是start()?
相信大家對于使用start方法來啟動一個新線程持懷疑態度,因為我們重寫了run方法,卻調用了start方法,那么我們就來看看源碼,打破疑慮.
?
先來看看調用run方法
結果是
通過我們上面使用jconsole知道了main是主線程的線程名,可見并沒有啟動一個新線程.
?
再來看看調用了start方法
?
結果是?
可見啟動了一個新線程,那么便可證明啟動新線程要調用的是start方法.
?
看下源代碼
?
?
結論:用start()方法才能實現多線程,只是單純的調用run方法相當于在當前調度線程中執行,并沒有多線程。
start0是本地方法,是JVM調度,底尾是c/c++實現.
真正實現多成程的效果,是start0,而不是run.
?
實現Runnable接口
1.java是單繼承的,在某些情況下一個類可能已經承了某個父類,這時再用繼承Thread類方法來創建線程顯然不可能了.
2.java設計者們提供了另外一個方式創建線程,就是通過實現Runnable接口來創建線程.
3.底層使用設計模式[靜態代理模式]
?
思路模擬:
?