线程及序列化

一、序列化与反序列化

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

时间: 2024-10-12 02:59:39

线程及序列化的相关文章

使用TProfiler分析并调优项目中的Fastjson序列化代码

新项目年后就上线了,现在业务上没什么问题,就用TProfiler做了下性能分析,果然有坑. 一.TProfiler入门 高手请自觉略过本节. 1.简介 TProfiler是阿里巴巴开源的一款性能分析工具.号称可以用于生产环境进行长期的性能分析.测试程序部署后,在低峰期对响应时间影响20%,在高峰期对QPS影响30%.详细介绍请见官方WIKI. 2.简要的实现原理 TProfiler的实现基于JAVA的Instrumentation 和ASM.Instrumentation可以理解为一种虚拟机级别

Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)

目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 虽然 NSOperation 是基于 GCD 实现的, 但是并不意味着它是一个 GCD 的 “dumbed-down” 版本, 相反,我们可以用NSOperation 轻易的实现一些 GCD 要写大量代码的事情. 因此, NSOperationQueue 是被

深入理解Runloop,看我一篇就够了

前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,为了让大家更加快速融入,请先一段代码: + (NSThread *)networkRequestThread { static NSThread *_networkRequestThread = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _networkRequestThread = [[NSThread alloc

转载iOS---&gt;NSRunLoop详解

转载--->NSRunLoop(详解) NSRunLoop大部分情况在多线程编程的时候才会用到..但是一般不会用NSRunLoop,因为它不是线程安全的.一般都建议用CFRunLoop,这个是线程安全的.input source and port-based custom source这些操作,是向线程里面添加操作的.添加的这些操作,会在该线程执行空间的调度下执行. 通俗的理解就是如果你创建的了一个子线程,子线程的运行函数如下- (void) subThread (void*)unused { 

run loop

Objective-C之run loop详解 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9237973 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出

Effective java 中文版本阅读总结

点击链接查看云笔记原文 花了半天时间,贪婪的啃读了Effective java 这本书(虽然闻名已久,但是很少看书) 翻着翻着就有种废寝忘食的感觉,下班了都留下来专门看书,后来索性带回家看了. 以下是内容总结,主要是对个人感觉有用的,有很大部分没有提及,因为水平有限,还没有来得及消化 1 引言 2 创建和销毁对象 # 静态工厂方法由于构造器 Boolean.valueOf(String); 几乎总是优于构造器Boolean(String);构造器每次调用的时候都会创建一个新的对象 * 对象创建比

理解java中的ThreadLocal(转)

一.对ThreadLocal概术 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联. 二.结合源码理解 可以看到ThreadLocal类中的变量只有这3个int型: private f

MySQL同步常见问题解答(自己的小心得)

前几天刚刚注册了博客园,我想写一些技巧性的教程,今天给大家分享一个MySQL同步常见问题解答. Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器? A:有多种方法.如果你在某时间点做过主服务器备份并且记录了相应快照的二进制日志名和偏移量(通过SHOW MASTER STATUS命令的输出),采用下面的步骤: 1.确保从服务器分配了一个唯一的服务器ID号. 2.在从服务器上执行下面的语句,为每个选项填入适当的值:mysql> CHANGE MASTER TO -> MASTER

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么