示例
在此示例中,我們要建立一個将生成并輸出到控制台的類,該類是在初始化期間作為參數傳遞的兩個整數範圍之間的随機數。
public class SimpleRangeRandom implements Runnable {
private int min;
private int max;
private Thread thread;
public SimpleRangeRandom(int min, int max){
this.min= min;
this.max= max;
thread = new Thread(this);
thread.start();
}
@Override
private void WriteObject(ObjectOutputStreamout) throws IO Exception;
private void ReadObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
public void run() {
while(true) {
Random rand = new Random();
System.out.println("Thread: " + thread.getId() + " Random:" + rand.nextInt(max - min));
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
現在,如果要使此類可序列化,則将存在一些問題。線程是某些不可序列化的系統級類之一。是以,我們需要将線程聲明為transient。通過這樣做,我們将能夠序列化此類的對象,但是仍然會遇到問題。正如您在構造函數中看到的那樣,我們設定了随機化器的最小值和最大值,然後啟動了負責生成和列印随機值的線程。是以,通過調用readObject()構造函數恢複持久對象時,由于不會建立新對象,是以構造函數将不會再次運作。在這種情況下,我們需要通過在類内部提供兩個方法來開發自定義序列化。這些方法是:
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
是以,通過在中添加實作,readObject()我們可以啟動和啟動線程:
class RangeRandom implements Serializable, Runnable {
private int min;
private int max;
private transient Thread thread;
//瞬變應該是無法序列化的任何字段e.gThread或您不想序列化的任何字段
public RangeRandom(int min, int max){
this.min= min;
this.max= max;
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
while(true) {
Random rand = new Random();
System.out.println("Thread: " + thread.getId() + " Random:" + rand.nextInt(max - min));
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
thread = new Thread(this);
thread.start();
}
}
這是我們示例的主要内容:
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
RangeRandom rangeRandom = new RangeRandom(1,10);
FileOutputStream fos = null;
ObjectOutputStream out = null;
try
{
fos = new FileOutputStream("test");
out = new ObjectOutputStream(fos);
out.writeObject(rangeRandom);
out.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
RangeRandom rangeRandom2 = null;
FileInputStream fis = null;
ObjectInputStream in = null;
try
{
fis = new FileInputStream("test");
in = new ObjectInputStream(fis);
rangeRandom2 = (RangeRandom)in.readObject();
in.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}
}
}
如果運作main,則将為每個RangeRandom執行個體運作兩個線程,這是因為該方法現在同時在構造函數和。Thread.start()readObject()