线程及序列化

一、序列化与反序列化

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

 

posted @ 2016-08-14 08:37  美味的你  阅读(434)  评论(0编辑  收藏  举报