java之线程
java之線程
一:線程:
線程是什么呢?線程,有時被稱為輕量級進程是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
線程,在程序中起到的作用,我覺得就是一個當需要程序幾乎在同一時間執行多個任務,并且不受干擾時需要用到。在程序中,我們都是從主函數的第一行,然后一行行的執行下來,只有前面的語句執行完了,我們才可以去執行下面的代碼,而線程的作用就是,開啟一個線程之后,然后把這一行或者多行代碼,總之是一個任務交給線程去執行,然后不管他有沒有執行完我都可以繼續執行接下來的代碼;就好比之前是只能寫完作業了,再去看電視,但是開啟線程之后就像是我進行了做作業的這個動作,但是我不管作業有沒有做完,然后我又可以去看電視了。多線性的話,也是如此,老師布置了作業,分配每個學生任務,然后學生自己各自去做,至于誰先完成,這個老師就不管了,老師也是自己去做事了。
然后呢我們再來看一看進程,進程就是運行中的程序,進程是在內存上運行,線程是在進程中運行,線程是不會有自己獨立的內存空間的,線程在運行后,無法獲取其他線程改變對象,屬性或變量,也就是線程質檢,在開始工作之后,就不能愉快的溝通了。而在變量前加上volatile就可以解決了。
二:線程的實現
1.線程的實現的兩種方法:
一:繼承Tread類;
run()運行方法;
start()啟動線程的方法;
sleep(int time)線程休眠的方法 ,參數是休眠的時長;
二:實現Runnable接口
只存在線程的run()運行方法;
2.實現Runnable接口比繼承Thread類所具有的優勢:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):可以避免java中的單繼承的限制
3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立。
三:線程控制小球的移動
在點擊窗體之后就會出現一個移動的小球。
要控制多個小球在窗體上移動,我們可以把小球當做一個對象,建立一個類Ball類;
? ? ? Ball類:屬性:小球的位置(x,y的坐標),小球移動的速度,
? ? ? ? ? ? ? ? 方法:小球移動的方法,畫小球的方法,擦出小球的方法,
? ? ? ? ? ? ? ? ? ? ? ? ?然后還需要重寫構造方法,在實例化的時候需要傳入小球的坐標;
? ? ? ? ? ? ? ? ? ? ? ? ?同時還需要傳入窗體的畫筆;
?
3.實現線程,Ball繼承Thread類(或者窗體類實現Runable接口),然后都要實現重寫run()方法;在run方法中實現小球的移動;
4.在窗體類中開啟線程;
?
如果是實現了Runable接口的話 ,開啟線程則是需要聲明并且實例化一個類然后調用run方法:
?
四:一個線程控制多個小球
在上面的的方法中是每點擊一次就會開啟一個線程,也就是多線程;而當小球點擊的數量多了的時候就會出現很閃的情況,而之所以出現這樣的情況也就是因為我們的小球畫的時候都會去調用一個畫筆對象,而我們的線程并不是同步的,所以會出現那種,1號線程要畫一個白色的小球(擦出),但是2號小球要畫一個黑的小球,這時,畫筆對象的變化就會引起窗體特別閃爍的情況;
解決這個問題的一個辦法就是:用一個線程來控制多個小球。
而要實現一個線程來控制多個小球,我們需要把小球存起來,在畫的時候從中取出來就可以了;
??? ? 我們來看代碼:1,首先定義一個數組,然后每點擊一次小球都存進去;
?
2.在窗體可見之后,就開啟線程;
?
3.因為在沒有點擊界面的時候,數組里面是空的,所以需要在畫的時候判斷數組是否為空,不為空,有小球,在畫;
? ? ?
?另外,就是建立雙緩沖了,所謂雙緩沖,就是在內存中開辟一片區域,作為后臺圖象,程序對它進行更新、修改,繪制完成后再顯示到屏幕上。其思想,簡單來說就是把需要畫的所有的小球先畫在(用Image的畫筆)一個Image上面,然后在用窗體的畫筆畫在窗體上;
在AWT中的雙緩沖,需要重寫update方法,在update里面中建立雙緩沖;在AWT組件中使用update()方法清空矩形區域,然后調用paint的方法來繪制圖片;
而在SWiNG組件中,因為SWiNG組件中的JFrame繼承了AWT組件的Frame并且重寫了update方法(調用了paint方法),沒有在去清空組件上的內容;所以SWING中重寫paint(),建立雙緩沖;
? ? ? 具體代碼(JFrame中):
當我們建立雙緩沖之后,我們做的游戲就不會這么閃啦;
?
?
?
?
?
? ?
?
?
?
轉載于:https://www.cnblogs.com/hesi/p/5750866.html
總結
- 上一篇: 第46条:for-each循环优先于传统
- 下一篇: Android自定义波浪加载圆形进度条—