第三次学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级单词!!!");
}
}

线程的五种状态

Java 怎么引用libs下面的jar包_java