序列化和反序列化及线程实现方式
2016-08-13 17:55
190 查看
一、序列化与反序列化
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
序列化关键代码如下:
定义Person类实现序列化。重写toString方法,定义无参以及带参构造
定义类
反序列化关键代码如下:
运行效果:
二、多线程两种实现方式
①继承Thread
②实现Runnable
1、继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
2、如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
三、
join():暂停某个线程
setDaemon()后台线程,又称守护线程,两个线程交替执行,当一个线程结束时,另一个线程也结束
Sleep():使线程休眠,单位是毫秒
关键代码:
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
序列化关键代码如下:
定义Person类实现序列化。重写toString方法,定义无参以及带参构造
定义类
public class MySerialize { public static void main(String[] args) throws IOException { OutputStream os=new FileOutputStream("save.bin"); ObjectOutputStream oos=new ObjectOutputStream(os); List<Person> list=new ArrayList<Person>(); Person p1=new Person("zs",12,"bj"); Person p2=new Person("hh",22,"ah"); Person p3=new Person("xixi",12,"hf"); list.add(p1); list.add(p2); list.add(p3); oos.writeObject(list); System.out.println("序列化成功!!!"); } }
反序列化关键代码如下:
public class FSerialize { public static void main(String[] args) throws Exception { InputStream is=new FileInputStream("save.bin"); ObjectInputStream ois=new ObjectInputStream(is); List<Person> list=(List<Person>)ois.readObject(); for (Person person : list) { System.out.println(person); } } }
运行效果:
二、多线程两种实现方式
①继承Thread
②实现Runnable
1、继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
package cn.b.happy; public class MyThread extends Thread{ @Override public void run() { System.out.println("我是新线程!"); } }
MyThread t1=new MyThread(); System.out.println(Thread.currentThread().getName()); t1.start();
2、如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
package cn.b.happy; public class ImplThread implements Runnable{ @Override public void run() { Thread.currentThread().setName("子线程2"); System.out.println("子线程"); System.out.println("我是子线程"); } }
ImplThread t2=new ImplThread(); //为了启动ImplThread,需要首先实例化一个Thread,并传入自己的t2实例: Thread tt=new Thread(t2); tt.run(); System.out.println(Thread.currentThread().getName()); }
三、
join():暂停某个线程
setDaemon()后台线程,又称守护线程,两个线程交替执行,当一个线程结束时,另一个线程也结束
Sleep():使线程休眠,单位是毫秒
关键代码:
package cn.c.happy; public class SleepThread extends Thread{ @Override public void run() { Thread.currentThread().setName("子线程"); for (int i = 1; i <=5; i++) { /*try { //休眠 Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }*/ System.out.println("B"+i+"\t"+Thread.currentThread().getName()); } } }
package cn.c.happy; public class Test { public static void main(String[] args) throws InterruptedException { SleepThread s1=new SleepThread(); s1.setDaemon(true); s1.start(); //交替执行 for (int i = 1; i <=5; i++) { if(i==3){ s1.join();// 调用join方法 执行完毕后再执行其他方法 } System.out.println("A"+i+"\t"+Thread.currentThread().getName()); } } }
相关文章推荐
- 线程实现方式以及序列化 反序列化.java
- 序列化与反序列化 实现序列化的方式
- 今天无意中发现JavaBean类基本都要求实现了Serializable接口,以前只是知道序列化以后,可以通过io流的方式将对象序列化和反序列化,进行存取,但不知道为什么需要序列化,今天总结一下
- 用匿名类的方式实现一个线程,并打印
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- c#实现对象的xml格式序列化及反序列化
- ArrayList的二进制序列化及反序列化实现
- C#实现对象的Xml格式序列化及反序列化
- 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- [原创]FlashActionScript序列化和反序列化的实现(第一版)
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- Java线程间通信-回调的实现方式
- 解决用序列化方式实现对象拷贝时出的异常解决方法
- C#实现对象的Xml格式序列化及反序列化
- C#实现对象的Xml格式序列化及反序列化
- C# 实现复杂对象的序列化与反序列化[收藏此页] [打印]【IT168知识库】