新聞中心
線程是進程中的一個獨立控制單元,線程在控制著進程的執(zhí)行,一個進程中至少有一個線程。多線程可以更好地利用cpu的資源,線程之間還能進行數(shù)據(jù)共享。

創(chuàng)新互聯(lián)公司服務(wù)項目包括撫順縣網(wǎng)站建設(shè)、撫順縣網(wǎng)站制作、撫順縣網(wǎng)頁制作以及撫順縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,撫順縣網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到撫順縣省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在Java中,一個線程是指進程中的一個執(zhí)行流程,一個進程可以運行多個線程,Java中每個線程都有一個調(diào)用棧,即使不在程序中創(chuàng)建任何新的線程,也有一個main()方法運行在一個線程內(nèi),稱為主線程,一旦創(chuàng)建一個新的線程,就產(chǎn)生一個新的調(diào)用棧。
多線程的基本概念
線程指進程中的一個執(zhí)行場景,也就是執(zhí)行流程,那么進程和線程有什么區(qū)別呢?
- 每個進程是一個應(yīng)用程序,都有獨立的內(nèi)存空間
- 同一個進程中的線程共享其進程中的內(nèi)存和資源
(共享的內(nèi)存是堆內(nèi)存和方法區(qū)內(nèi)存,棧內(nèi)存不共享,每個線程有自己的。)
什么是進程?
一個進程就是一個應(yīng)用程序。在操作系統(tǒng)中每啟動一個應(yīng)用程序就會相應(yīng)的啟動一個進程。例如:千千靜聽進程,魔獸進程,Word 進程,QQ 進程,JVM 啟動對應(yīng)一個進程。
系統(tǒng)引入多進程的作用?
最初的計算機是“單進程的”,計算機只能運行一個應(yīng)用程序,例如第一臺計算機只有DOS 窗口?,F(xiàn)代的計算機可以滿足我們一邊聽音樂,一邊玩游戲?,F(xiàn)代的計算給我們?nèi)祟惛杏X:多件事情一起運行。感覺是并行的(錯覺)。
對于單核的計算機來講,在某一個時間點上只能做一件事情,但是由于計算機的處理速度 很高,多個進程之間完成頻繁的切換執(zhí)行,這個切換速度使人類產(chǎn)生了錯覺,人類的錯覺是:
多個進程在同時運行。
計算機引入多進程的作用:提高 CPU 的使用率。
- 重點:進程和進程之間的內(nèi)存獨立。
什么是線程?
線程是進程的一個執(zhí)行場景。一個進程可以啟動多個線程。
進程引入多線程的作用?
提高進程的使用率。
- 重點:線程和線程之間棧內(nèi)存獨立,堆內(nèi)存和方法區(qū)內(nèi)存共享。一個線程一個棧。
描述 java 程序的執(zhí)行原理:
java命令執(zhí)行會啟動 JVM,JVM的啟動表示啟動一個應(yīng)用程序,表示啟動了一個進程。該進程會自動啟動一個“主線程”,然后主線程負責(zé)調(diào)用某個類的 main 方法。所以 main 方法的執(zhí)行是在主線程中執(zhí)行的。然后通過main 方法代碼的執(zhí)行可以啟動其他的“分支線程”。
所以,main 方法結(jié)束程序不一定結(jié)束,因為其他的分支線程有可能還在執(zhí)行。
線程的創(chuàng)建和啟動
Java 虛擬機的主線程入口是main 方法,用戶可以自己創(chuàng)建線程,創(chuàng)建方式有兩種:
- 繼承 Thread 類
- 實現(xiàn)Runnable 接口(推薦使用Runnable 接口)
繼承 Thread 類
Thread 類中創(chuàng)建線程最重要的兩個方法為:
- public void run()
- public void start()
采用 Thread 類創(chuàng)建線程,用戶只需要繼承 Thread,覆蓋 Thread 中的run 方法,父類 Thread 中的run 方法沒有拋出異常,那么子類也不能拋出異常,最后采用start 啟動線程即可
【示例代碼】,不使用線程
- public class ThreadTest01 {
- public static void main(String[] args) { Processor p = new Processor(); p.run();
- method1();
- }
- private static void method1() { System.out.println("--------method1() ");
- }
- }
- class Processor {
- public void run() {
- for (int i=0; i<10; i++) { System.out.println(i);
- }
- }
- }
以上順序輸出相應(yīng)的結(jié)果(屬于串行),也就是run 方法完全執(zhí)行完成后,才執(zhí)行method1 方法,也就是method1 必須等待前面的方法返回才可以得到執(zhí)行,這是一種“同步編程模型”
【代碼示例】,使用線程
- public class ThreadTest02 {
- public static void main(String[] args) { Processor p = new Processor();
- //手動調(diào)用該方法
- //不能采用run 來啟動一個場景(線程),
- //run 就是一個普通方法調(diào)用
- //p.run();
- //采用start 啟動線程,不是直接調(diào)用run
- //start 不是馬上執(zhí)行線程,而是使線程進入就緒
- //線程的正真執(zhí)行是由Java 的線程調(diào)度機制完成的
- p.start();
- //只能啟動一次
- //p.start();
- method1();
- }
- private static void method1() { System.out.println("--------method1() ");
- }
- }
- class Processor extends Thread {
- //覆蓋 Thread 中的run 方法,該方法沒有異常
- //該方法是由java 線程掉機制調(diào)用的
- //我們不應(yīng)該手動調(diào)用該方法public void run() {
- for (int i=0; i<10; i++) { System.out.println(i);
- }
- }
- }
通過輸出結(jié)果大家會看到,沒有順序執(zhí)行,而在輸出數(shù)字的同時執(zhí)行了 method1()方法,如果從效率上看,采用多線程的示例要快些,因為我們可以看作他是同時執(zhí)行的,mthod1()方法沒有等待前面的操作完成才執(zhí)行,這叫“異步編程模型”
實現(xiàn) Runnable 接口
其實 Thread 對象本身就實現(xiàn)了Runnable 接口,但一般建議直接使用 Runnable接口來寫多線程程序,因為接口會比類帶來更多的好處
【示例代碼】
- public class ThreadTest03 {
- public static void main(String[] args) {
- //Processor r1 = new Processor(); Runnable r1 = new Processor();
- //不能直接調(diào)用run
- //p.run();
- Thread t1 = new Thread(r1);
- //啟動線程t1.start();
- method1();
- }
- private static void method1() { System.out.println("--------method1() ");
- }
- }
- //實現(xiàn)Runnable 接口
- class Processor implements Runnable {
- //實現(xiàn)Runnable 中的run 方法
- public void run() {
- for (int i=0; i<10; i++) { System.out.println(i);
- }
- }
- }
分享文章:看完這篇Java多線程的講解,思路突然就清晰了...
文章源于:http://www.dlmjj.cn/article/dhgpdpj.html


咨詢
建站咨詢
