一、序列化与反序列化

      把对象转换为字节序列的过程称为对象的序列化
  把字节序列恢复为对象的过程称为对象的反序列化
  对象的序列化主要有两种用途:
  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());
}
}
}

最新文章

  1. jq跑马灯效果
  2. useful tips for win7--close the noise volume(关掉win7开机、系统操作的声音)
  3. .net 环境下get 获取页面出现乱码问题解决
  4. 利用jstree插件轻松构建树应用
  5. 在SharePoint 2013中显示“以其他用户身份登录”
  6. 更新CocoaPods碰到的问题及知识点
  7. Javascript setTimeout 带参数延迟执行 闭包实现
  8. 如何浏览并管理 Outlook 邮件?
  9. Office 365 - SharePoint Tips &amp; Tricks
  10. Android基础总结(9)——网络技术
  11. memcache实现公共计数器网站
  12. 如何打造100亿SDK累计覆盖量的大数据系统
  13. ssh框架的小实例(用户登录)
  14. java日期格式大全 format SimpleDateFormat(转)
  15. Python 解LeetCode:367. Valid Perfect Square
  16. 三、数据API-3
  17. app 性能
  18. vue中svg图标使用
  19. CSS实例:图片导航块
  20. js DOM常见事件

热门文章

  1. rem在响应式布局中的应用
  2. sharepoint2010如何本地化WebPart的Category、WebDisplayName 和 WebDescription 属性
  3. SharePoint 2013 开发文档管理字段小记
  4. 关于SharePoint 2013 UserProfile跨场的几点注意
  5. tomcat中的JSP引擎
  6. 【代码笔记】iOS-评分系统(小星星)
  7. OC 内存泄露 自动释放池
  8. 阿里资深工程师分享支付宝热补丁技术—— AndFix原理
  9. Spark:一个高效的分布式计算系统
  10. PHP isset() 检测变量是否设置