標籤(空格分隔): Javajava
/** * 進程:是一個正在執行中的程序.每個進程執行都有一個執行順序,該順序是一個 * 執行路徑,或者叫一個控制單元 * 線程:就是進程中的一個獨立的控制單元,線程控制着進程的執行 * * 一個進程中至少有一個線程 *java vm 啓動的時候會有一個進程java.exe *該進程中至少有一個線程,負責java程序的執行,並且這個線程運行的代碼存在於 *main方法中 *該線程稱爲主線程 * * *擴展:其實更細節說明jvm,jvm啓動不止一個線程還有負責垃圾回收機制的線程 * *1.如何在自定義的代碼中,自定義一個線程呢 * *經過對api的查找,java已經提供了對線程這類事物的描述,就Thread類' *建立線程的第一種方式:繼承Thread類 *步驟: *1.定義類繼承Thread *2.複寫Thread類中的run方法 *目的:將定義的代碼存貯在run方法中,讓線程運行 *3.調用線程的start方法,該方法兩個做用: *啓動線程,調用run方法 * *發現運行結果每一次都不一樣,由於多個線程都獲取cpu的執行權.cpu執行 *到誰,誰就運行 *明確一點,在某一個時刻,只能有一個程序在運行(多核除外) *cpu在作着快速的切換,以達到看上去是同時運行的效果. *咱們能夠形象把多線程的運行行爲在互相搶奪cpu的執行權 *這就是一個多線程的特性:隨機性 *誰搶到誰執行,至於執行多長時間,cpu說的算. * * * *爲何要覆蓋run方法 * * * Thread類用於描述線程 * 該類就定義了一個功能,用於存儲線程要運行的代碼.該存儲功能就是run方法 * * * 也就是說Thread類中的run方法,用於存儲線程要運行的代碼 */ class Demo extends Thread { public void run() { for(int x=0;x<60;x++) System.out.println("demo run"); } } public class ThreadDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Demo d=new Demo();//建立好一個線程 d.run();//僅僅是對象調用方法,而線程建立了,並無運行 //d.start();//開啓線程並執行該線程的run方法 for(int x=0;x<60;x++) { System.out.println("hello world"); } } }
/** * java中stack的使用方法,堆棧是一種"後進先出"(LIFO)的數據結構,只能在一端進行插入(稱爲"壓棧")或刪除(稱爲"出棧")數據的操做. * Java中,使用java.util.Stack類的構造方法建立對象 * public class Stack extends vector * 構造方法:public Stack()建立一個空Stack * 1.public push(item)把item壓入棧頂.其做用與addElement(item)相同 * 2.public pop移除棧頂對象,並做爲函數的值返回該對象 * 3.public peek()查看棧頂對象而不移除它 * 4.public boolean empty()測試堆棧是否爲空 * 5.public int search(Object object)返回對象在堆棧中的位置 */ import java.util.Enumeration; import java.util.Stack; /** * 學習Stack的用法 * @author Android將軍 * */ public class StackTest { public static void main(String[] args) { //建立堆棧對象 Stack stack=new Stack(); System.out.println("aaaa,bbbb,cccc三個元素入棧"); //向棧中壓入字符串aaaa stack.push("aaaa"); //顯示棧中的全部元素 printStack(stack); stack.push("bbbb"); printStack(stack); stack.push("cccc"); printStack(stack); String s=new String("aaaa"); System.out.println("元素aaaa在堆棧的位置"+stack.search(s)); s=new String("bbbb"); System.out.println("元素bbbb在堆棧的位置"+stack.search(s)); System.out.println("aaaa,bbbb,cccc三個元素出棧"); System.out.println("元素"+stack.pop()+"出棧"); printStack(stack); System.out.println("元素"+stack.pop()+"出棧"); printStack(stack); System.out.println("元素"+stack.pop()+"出棧"); printStack(stack); } private static void printStack(Stack stack) { if(stack.empty()) { System.out.println("堆棧是空的,沒有元素"); } else { System.out.print("堆棧中的元素:"); //獲得Stack中的枚舉對象 Enumeration items=stack.elements(); //顯示枚舉(stack)中的全部元素 while(items.hasMoreElements()) { System.out.print(items.nextElement()+""); } } System.out.println();//換行 } }
final在java中並不經常使用,然而它卻爲咱們提供了諸如在c語言中定義常量的功能,不只如此,final還可讓你控制你的成員、方法或者是一個類是否可被重寫或繼承等功能,這些特色使final在java中擁有了一個不可或缺的地位,也是學習java時必需要知道和掌握的關鍵字之一。android
final成員:當你在類中定義變量時,在其前面加上final關鍵字,那即是說,這個變量一旦被初始化便不可改變,這裏不可改變的意思對基本類型來講是其值不可變,而對於對象變量來講是其引用不可再變。其初始化能夠在兩個地方,一是其定義處,也就是說在final變量定義時直接給其賦值,二是在構造函數中,注意,這兩個地方只能選其一,要麼在定義時給值,要麼在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值。還有一種用法是定義方法中的參數爲final,對於基本類型的變量,這樣作並無什麼實際意義,由於基本類型的變量在調用方法時是傳值的,也就是說你能夠在方法中更改這個參數變量而不會影響到調用語句。然而對於對象變量,卻顯得很實用,由於對象變量在傳遞時是傳遞其引用,這樣你在方法中對對象變量的修改也會影響到調用語句中的對象變量,當你在方法中不須要改變做爲參數的對象變量時,明確使用final進行聲明,會防止你無心的修改而影響到調用方法。api
final方法:將方法聲明爲final,那就說明你已經知道這個方法提供的功能已經知足你要求,不須要進行擴展,而且也不容許任何今後類繼承的類來重寫這個方法,可是繼承仍然能夠繼承這個方法,也就是說能夠直接使用。另外有一種被稱爲inline的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提升,然而當你的方法主體很是龐大時,或你在多處調用此方法,那麼你的調用主體代碼便會迅速膨脹,可能反而影響效率,因此你要慎用final進行方法定義。數據結構
final類:當你將final用於類身上時,你就須要仔細考慮,由於一個final類是沒法被任何人繼承的,那也就意味着此類在一個繼承樹中是一個葉子類,而且此類的設計已被認爲很完美而不須要進行修改或擴展。對於final類中的成員,你能夠定義其爲final,也能夠不是final。而對於方法,因爲所屬類爲final的關係,天然也就成了final型的。你也能夠明確的給final類中的方法加上一個final,但這顯然沒有意義。
https://blog.csdn.net/android_jiangjun/article/details/41593609多線程