java基礎知識(11)---多線程

來源:互聯網
上載者:User

標籤:err   java   建立   csharp   zed   運行   logs   應用程式   錯誤資料   

多線程:進程:進行中中的程式。其實進程一個應用程式運行時的記憶體配置空間線程:其實就是進程中一個程式執行控制單元,一條執行路徑。進程負責的是應用程式的空間的標示。線程負責的是應用程式的執行順序。一個進程至少有一個線程在運行,當一個進程中出現多個線程時,就稱這個應用程式是多線程應用程式,每個線程在棧區中都有自己的執行空間,自己的方法區、自己的變數。jvm在啟動的時,首先有一個主線程,負責程式的執行,調用的是main函數。主線程執行的代碼都在main方法中。當產生垃圾時,收垃圾的動作,是不需要主線程來完成,因為這樣,會出現主線程中的代碼執行會停止,會去運行記憶體回收行程代碼,效率較低,所以由單獨一個線程來負責記憶體回收。 隨機性的原理:因為cpu的快速切換造成,哪個線程擷取到了cpu的執行權,哪個線程就執行。返回當前線程的名稱:Thread.currentThread().getName()線程的名稱是由:Thread-編號定義的。編號從0開始。線程要啟動並執行代碼都統一存放在了run方法中。線程要運行必須要通過類中指定的方法開啟。start方法。(啟動後,就多了一條執行路徑)start方法:1)、啟動了線程;2)、讓jvm調用了run方法。建立線程的第一種方式:繼承Thread ,由子類複寫run方法。步驟:1,定義類繼承Thread類;2,目的是複寫run方法,將要讓線程啟動並執行代碼都儲存到run方法中;3,通過建立Thread類的子類對象,建立線程對象;4,調用線程的start方法,開啟線程,並執行run方法。線程狀態:被建立:start()運行:具備執行資格,同時具備執行權;凍結:sleep(time),wait()—notify()喚醒;線程釋放了執行權,同時釋放執行資格;臨時阻塞狀態:線程具備cpu的執行資格,沒有cpu的執行權;消亡:stop()建立線程的第二種方式:實現一個介面Runnable。步驟:1,定義類實現Runnable介面。2,覆蓋介面中的run方法(用於封裝線程要啟動並執行代碼)。3,通過Thread類建立線程對象;4,將實現了Runnable介面的子類對象作為實際參數傳遞給Thread類中的建構函式。為什麼要傳遞呢?因為要讓線程對象明確要啟動並執行run方法所屬的對象。5,調用Thread對象的start方法。開啟線程,並運行Runnable介面子類中的run方法。Ticket t = new Ticket();/*直接建立Ticket對象,並不是建立線程對象。因為建立對象只能通過new Thread類,或者new Thread類的子類才可以。所以最終想要建立線程。既然沒有了Thread類的子類,就只能用Thread類。*/Thread t1 = new Thread(t); //建立線程。/*只要將t作為Thread類的建構函式的實際參數傳入即可完成線程對象和t之間的關聯為什麼要將t傳給Thread類的建構函式呢?其實就是為了明確線程要啟動並執行代碼run方法。*/t1.start();為什麼要有Runnable介面的出現?1:通過繼承Thread類的方式,可以完成多線程的建立。但是這種方式有一個局限性,如果一個類已經有了自己的父類,就不可以繼承Thread類,因為java單繼承的局限性。可是該類中的還有部分代碼需要被多個線程同時執行。這時怎麼辦呢?只有對該類進行額外的功能擴充,java就提供了一個介面Runnable。這個介面中定義了run方法,其實run方法的定義就是為了儲存多線程要啟動並執行代碼。所以,通常建立線程都用第二種方式。因為實現Runnable介面可以避免單繼承的局限性。2:其實是將不同類中需要被多線程執行的代碼進行抽取。將多線程要啟動並執行代碼的位置單獨定義到介面中。為其他類進行功能擴充提供了前提。所以Thread類在描述線程時,內部定義的run方法,也來自於Runnable介面。實現Runnable介面可以避免單繼承的局限性。而且,繼承Thread,是可以對Thread類中的方法,進行子類複寫的。但是不需要做這個複寫動作的話,只為定義線程代碼存放位置,實現Runnable介面更方便一些。所以Runnable介面將線程要執行的任務封裝成了對象。-------------------------------------------------------//面試new Thread(new Runnable(){  //匿名public void run(){System.out.println("runnable run");}}{public void run(){System.out.println("subthread run");}}.start();  //結果:subthread run---------------------------------------------------------Try {Thread.sleep(10);}catch(InterruptedException e){}// 當刻意讓線程稍微停一下,類比cpu 切換情況。多安全執行緒問題的原因:通過圖解:發現一個線程在執行多條語句時,並運算同一個資料時,在執行過程中,其他線程參與進來,並操作了這個資料。導致到了錯誤資料的產生。涉及到兩個因素:1,多個線程在操作共用資料。2,有多條語句對共用資料進行運算。原因:這多條語句,在某一個時刻被一個線程執行時,還沒有執行完,就被其他線程執行了。解決安全問題的原理:只要將操作共用資料的語句在某一時段讓一個線程執行完,在執行過程中,其他線程不能進來執行就可以解決這個問題。如何進行多句操作共用資料代碼的封裝呢?java中提供了一個解決方式:就是同步代碼塊。格式:synchronized(對象) {  // 任意對象都可以。這個對象就是鎖。需要被同步的代碼;}

  

java基礎知識(11)---多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.