第三次学JAVA再学不好就吃翔(part117)--单例设计模式
学习笔记,仅供参考,有错必纠
文章目录
多线程
单例设计模式
饿汉式
懒汉式
第三种格式
Timer类
线程的五种状态
单例设计模式
单例设计模式,即保证类在内存中只有一个对象,如何保证类在内存中只有一个对象呢:
控制类的创建,不让其他类来创建本类的对象;
在本类中定义一个本类的对象;
提供本类对象的公共访问方式。
饿汉式
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,创建本类对象
private static Singleton s = new Singleton();
//3,对外提供公共的访问方法
public static Singleton getInstance() {//获取实例
return s;
}
}
懒汉式
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,声明一个引用
private static Singleton s ;
//3,对外提供公共的访问方法
public static Singleton getInstance() {//获取实例
if(s == null) {
//线程1等待,线程2等待
s = new Singleton();
}
return s;
}
}
第三种格式
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,声明一个引用
public static final Singleton s = new Singleton();
}
举个例子
单例设计模式:
package com.guiyang.restudy3;
public class D5GetThreadObject {
public static void main(String[] args) {
Singleton s1 = Singleton.s;
Singleton s2 = Singleton.s;
System.out.println(s1 == s2);
}
}
class Singleton {
//1,私有构造方法,其他类不能访问该构造方法了
private Singleton(){}
//2,声明一个引用
public static final Singleton s = new Singleton();
}
控制台输出:
true
Timer类
Timer类是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
构造方法
public Timer()
创建一个新计时器,相关的线程不作为守护程序运行。
方法
public void schedule(TimerTask task, Date time)
安排在指定时间执行指定任务。如果此时间已过去,则安排立即执行该任务。
public void schedule(TimerTask task, Date firstTime, long period)
安排指定任务在指定时间开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
举个例子
JAVA代码:
package com.guiyang.restudy3;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class D5GetThreadObject {
public static void main(String[] args) throws InterruptedException {
Timer t = new Timer();
//在指定时间安排指定任务
//第一个参数,是安排的任务,第二个参数是执行的时间,第三个参数是过多长时间再重复执行
t.schedule(new MyTimerTask(), new Date(120, 8, 26, 10, 13, 0), 3000);
while(true) {
Thread.sleep(1000);
System.out.println(new Date());
}
}
}
/*public Date(int year,
int month,
int day)已过时。 使用构造方法 Date(long date) 替代
构造一个使用给定 year、month 和 day 初始化的 Date 对象。
如果给定参数超出范围,则结果是不确定的。
参数:
year - year 减去 1900,它必须是 0 到 8099 之间的数。(注意,8099 是由 9999 减去 1900 得到的。)
month - 0 到 11 之间的数
day - 1 到 31 之间的数
hrs - 0-23之间的小时数
min - 0-59之间的分钟数
sed - 0-59之间的秒数*/
class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("背6级单词!!!");
}
}
线程的五种状态