① 簡速java語言中線程對象都有哪些狀態,這些狀態如何變化
線程的狀態轉換是線程式控制制的基礎。線程狀態總的可分為五大狀態:分別是生、死、可運行、運行、等待/阻塞。用一個圖來描述如下:
1、新狀態:線程對象已經創建,還沒有在其上調用start()方法。
2、可運行狀態:當線程有資格運行,但調度程序還沒有把它選定為運行線程時線程所處的狀態。當start()方法調用時,線程首先進入可運行狀態。在線程運行之後或者從阻塞、等待或睡眠狀態回來後,也返回到可運行狀態。
3、運行狀態:線程調度程序從可運行池中選擇一個線程作為當前線程時線程所處的狀態。這也是線程進入運行狀態的唯一一種方式。
4、等待/阻塞/睡眠狀態:這是線程有資格運行時它所處的狀態。實際上這個三狀態組合為一種,其共同點是:線程仍舊是活的,但是當前沒有條件運行。換句話說,它是可運行的,但是如果某件事件出現,他可能返回到可運行狀態。
5、死亡態:當線程的run()方法完成時就認為它死去。這個線程對象也許是活的,但是,它已經不是一個單獨執行的線程。線程一旦死亡,就不能復生。 如果在一個死去的線程上調用start()方法,會拋出java.lang.IllegalThreadStateException異常。
有關詳細狀態轉換圖可以參看本人的「Java多線程編程總結」中的圖
二、阻止線程執行
對於線程的阻止,考慮一下三個方面,不考慮IO阻塞的情況:
睡眠;
等待;
因為需要一個對象的鎖定而被阻塞。
1、睡眠
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)靜態方法強制當前正在執行的線程休眠(暫停執行),以「減慢線程」。當線程睡眠時,它入睡在某個地方,在蘇醒之前不會返回到可運行狀態。當睡眠時間到期,則返回到可運行狀態。
線程睡眠的原因:線程執行太快,或者需要強制進入下一輪,因為Java規范不保證合理的輪換。
睡眠的實現:調用靜態方法。
try {
Thread.sleep(123);
} catch (InterruptedException e) {
e.printStackTrace();
}
睡眠的位置:為了讓其他線程有機會執行,可以將Thread.sleep()的調用放線程run()之內。這樣才能保證該線程執行過程中會睡眠。
例如,在前面的例子中,將一個耗時的操作改為睡眠,以減慢線程的執行。可以這么寫:
public void run() {
for(int i = 0;i<5;i++){
// 很耗時的操作,用來減慢線程的執行
// for(long k= 0; k <100000000;k++);
try {
Thread.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace(); .
}
System.out.println(this.getName()+" :"+i);
}
}
② java中為什麼要進行對象序列化
序列化就是將一個對象的狀態(各個屬性量)保存起來,然後在適當的時候再獲得。
序列化分為兩大部分:序列化和反序列化。序列化是這個過程的第一部分,將數據分解成位元組流,以便存儲在文件中或在網路上傳輸。反序列化就是打開位元組流並重構對象。對象序列化不僅要將基本數據類型轉換成位元組表示,有時還要恢復數據。恢復數據要求有恢復數據的對象實例
序列化的什麼特點:
如果某個類能夠被序列化,其子類也可以被序列化。聲明為static和transient類型的成員數據不能被序列化。因為static代表類的狀態, transient代表對象的臨時數據。
什麼時候使用序列化:
一:對象序列化可以實現分布式對象。主要應用例如:RMI要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。
二:java對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入位元組流中,可以保存在文件中或在網路連接上傳遞。利用對象序列化可以進行對象的"深復制",即復制對象本身及引用的對象本身。序列化一個對象可能得到整個對象序列。
③ java集合中想對象存儲在裡面後取出來後還要進行強轉為什麼 謝謝
因為如果是普通集合取來的集合元素是Object 類型,所以需要給他強制類型轉換成目標類型。如果使用泛型集合 則無需轉換 如List<String > list=new ArrayList<String >();string str= list.get(0); 使用泛型集合就無需考慮類型轉換了
④ java序列化問題以及怎麼存儲一個類對象
這不是亂碼,這是正常現象,只要重新載入到java程序中(反序列化),對象才能用。
⑤ java怎麼把一個程序對象存到List里
1、可以通過list的add方法來進行添加,可以通過get方法獲取到數據內容(即可是任何對象)。
2、實體類型如果為數組的話,可以直接通過list的add方法進行添加轉換,舉例List<Object> list = new ArrayList<Object>(),定義一個數組類型的list對象String entity = new String[("1232"),創建一個要實體化的數組對象list.add(entity ),給list對象賦值,這樣就完成了對象的轉換可以獲取到list的數據:list.get(0),結果就是entity對象(實際此對象是字元串)。
3、因為Object類型是任何對象類型的父類,所以不需要強制轉換即可完成添加。
⑥ java中的對象是怎麼存儲的
stack 區存放函數參數和局部變數;
heap 區存放對象;
data 區存放static 的變數或者字元串常量;
code 區存放類中的方法;
stack 棧 -->放方法的參數 和局部變數.就像這樣
-----------
void test(String[] args){
int xx = 0;// args和 xx在jvm load class時存放在棧中
}
heap 堆 --> 堆要比棧要大得多. 當一個對象對new出來時,該對象放在heap中,對象引用放在棧中.
data區,也就是數據區 -->靜態的變數 和 string的常量.
code 代碼區 --->classloader類載入器載入該class時存放類中的方法.
⑦ java內存模型的java對象的內存分配
(1) 寄存器(register)。這是最快的保存區域,這是主要由於它位於處理器內部。然而,寄存器的數量十分有限,所以寄存器是需要由編譯器分配的。我們對此沒有直接的控制權,也不可能在自己的程序里找到寄存器存在的任何蹤跡。
(2) 堆棧(stack)。位於通用RAM(隨機訪問存儲器)中。可通過它的「堆棧指針」 獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」 。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些Java 數據要保存在堆棧里— — 特別是對象句柄(也稱對象的引用),但Java對象並不放到其中。
(3) 堆(heap)。一種通用性的內存池(也在RAM區域),其中保存了Java對象。和堆棧不同的是,「內存堆」或「堆」(Heap )最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new 命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價。在堆里分配存儲空間時會花掉更長的時間!
(4) 靜態存儲(static storage)。這兒的「靜態」(Static)是指「位於固定位置」(盡管也在RAM 里)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但Java 對象本身永遠都不會置入靜態存儲空間。
(5) 常數存儲(constant storage)。常數值通常直接置於程序代碼內部。這樣做是安全的,因為它們永遠都不會改變。
(6) 非RAM 存儲(non-storage-RAM)。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。其中兩個最主要的例子便是「 流式對象」和「固定對象」 。對於流式對象,對象會變成位元組流,通常會發給另一台機器。而對於固定對象,對象保存在磁碟中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技巧就是它們能存在於其他媒體中。一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。Java 1.1提供了對輕量級持久化(Lightweight persistence)的支持。未來的版本甚至可能提供更完整的方案。
⑧ java 中有關對象臨時存儲的問題
編寫一個類,用來存儲臨時的對象,並編寫必要的方法來處理你的要求,這樣能很好控制和操作
⑨ java中為什麼要進行對象序列化
對象的序列化就是為了數據傳輸,在你的代碼的里是對象格式,而在傳輸的時候不可能還保持這對象的樣子。
當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網路上傳送。發送方需要把這個java對象轉換為位元組序列,才能在網路上傳送;接收方則需要把位元組序列再恢復為java對象。
1.概念
序列化:把java對象轉換為位元組序列的過程。
反序列化:把位元組序列恢復為java對象的過程。
2.用途
對象的序列化主要有兩種用途:
1)
把對象的位元組序列永久地保存到硬碟上,通常存放在一個文件中;
2)
在網路上傳送對象的位元組序列。