Java多线程编程核心技术( 九 )


( task, Date , long )
如果执行任务的时间没有延迟 , 那么下一次执行任务的时间是参考上一次任务的“开始”时间来计算 。
( task, Date , long ) 与 ( task, Date , long ) 比较:
1.都会按照顺序执行 , 所以不要考虑非线程安全的情况 。
2.主要区别在于不延时的情况:
如果不延时 , 那么下一次执行任务的时间参考上一次任务开始的时间 。
延时的情况没有区别 , 即如果执行任务的时间被延时 , 那么下一次执行任务的时间是按照上一次任务结束的时间来计算 。
方法不具有追赶执行性 , 具有追赶执行性(设置的时间比当前时间早的情况) 。
44.单例模式与多线程
立即加载/饿汉模式:立即加载就是使用类的时候已经将对象创建完毕 , 常见的办法是直接new实例化
/*** //立即加载/饿汉模式* @author katy.xie**/public class Singleton {private static Singleton singleton = new Singleton();privateSingleton() {}public static Singleton getInstance(){return singleton;}}
延迟加载/懒汉模式:在调用方法时实例才被创建 。
利用DCL双检查锁机制来实现多线程环境中的延迟加载单例设计模式
public class Singleton {private static Singleton singleton;private Singleton(){}public static Singleton getInstance(){try {if(singleton != null){}else{Thread.sleep(3000);synchronized (Singleton.class) {if(singleton == null){singleton = new Singleton();}}}} catch (Exception e) {e.printStackTrace();}return singleton;}}
使用静态内置类实现单例模式
public class Singleton {//静态内置类private static class SingletonHandler{private static Singleton singleton = new Singleton();}private Singleton(){}public static Singleton getInstance(){return SingletonHandler.singleton;}}
序列化与反序列化的单例模式实现
public class Singleton implements Serializable{private static final long serialVersionUID = 1L;//内部类方式private static class SingletonHandler {private static final Singleton singleton = new Singleton();}private Singleton(){}public static Singleton getInstance(){return SingletonHandler.singleton;}}
使用代码块实现单例模式
public class Singleton{private static Singleton singleton = null;private Singleton(){}static{singleton = new Singleton();}public static Singleton getInstance(){return singleton;}}
使用enum枚举数据类型实现单例模式
枚举enmu和静态代码块的特性相似 , 在使用枚举时 , 构造方法会被自动调用 , 也可以应用其这个特性实现单例设计模式 。
45.线程状态
NEW:线程实例化后还没有执行start()的状态
:线程进入运行的状态(就绪)
:线程被销毁时的状态
:线程执行了sleep() , 呈等待状态 , 等待时间到达 , 继续向下运行 。
:出现在某个线程在等待锁的时候 。
:执行了wait()方法
46. 线程组
可以批量的管理线程或者线程组对象 , 有效的对线程或者线程组对象进行组织 。
46.1 线程对象关联线程组:1级关联
即父对象中有字对象 , 但并不创建子孙对象 。这种情况经常出现在开发中 , 比如创建一些线程时 , 为了有效的对这些线程进行组织管理 , 通常的情况下是创建一个线程组 , 然后再将部分线程归属到该组中 , 这样的处理可以对线程对象进行有效的组织与规划 。