死锁
不同的线程分别占用对方需要的同步资源不放弃,都等待对方放弃自己需要的同步资源,就形成了线程的死锁
解决死锁的方法
通过Lock实现类

wait() 与 notify() 和notifyAll()
wait():令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待notifyAll ():唤醒正在排队等待资源的所有线程结束等待.
Java.lang.Object提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常


Date类
创建一个date对象,得到的是当前时间 Date date=new Date();
1.获取当前时间的毫秒值 long time = date.getTime();
2.Date(long date)分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
Date date2=new Date(0);
一小时以后Date date=new Date(time+60*60*1000);
一天以后date=new Date(time+24*60*60*1000);
3.date.getDate()获取日期
4.date.getDay()获取星期几
5.date.getSeconds() 获取毫秒值
6.date.getMonth() 获取月份(注意月份是从0开始到11月)
7.date.getTimezoneOffset()
8.设置年份为2021date.setYear(2021-1900);
9.设置月份date.setMonth(3);//将月份设置为4月
date.setMonth(Calendar.APRIL);
java.util.Date 和 java.sql.Date
java.sql.Date是java.util.Date的子类
java.util.date 和java.sql.date之间的转换
一:java.sql.date可以直接转为java.util.date,java.util.date父类,子类转父类是安全的,向上转型
二:java.util.date可以通过毫秒值作为参数转为java.sql.date
字符串和日期对象之间的转化
1.SimpleDateFormat中需要记忆的时间和日期模式,区分大小写的
y (Year) M (Month) d (月份中的天数) H [24小时制(0~23)]
m (分钟数minute) (s 秒seconds) (S 毫秒)
2.日期时间对象 转成 字符串文本
Date date=new Date();//根据当前时间new一个对象
SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒SSS毫秒");
String format = sdf.format(date);
System.out.println("format = " + format);
3.将字符串 解析为 日期对象
String date_str="2021年04月15日 15时17分21秒";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
Date parse = sdf.parse(date_str);//调用parse(String str)将字符串解析为日期对象
System.out.println("parse = " + parse);
4.将字符串"2021-04-15"转为java.sql.Date对象
String info="2021-04-15";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(info);
java.sql.Date date=new java.sql.Date(parse.getTime());
System.out.println("date = " + date);
Calendar类
1.public abstract class Calendar,是一个抽象类抽象类不能直接实例化,通过静态方法getInstance()方法获取其子类对象
Calendar c=Calendar.getInstance();
2.将Calendar子类对象转为Date对象
public final DategetTime()
3.get方法获取年月日星期
c.get(Calendar.YEAR)
c.get(Calendar.MONTH)
c.get(Calendar.DAY_OF_MONTH)
c.get(Calendar.DAY_OF_WEEK)
4.void set(int field, int value)
将给定的日历字段设置为给定值。
void set(int year, int month, int date)
设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute)
设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值
c.set(Calendar.YEAR,2066);
c.set(Calendar.MONTH,Calendar.APRIL);
c.set(2021,Calendar.APRIL,15);//设置年月日
c.set(2021,Calendar.APRIL,15,16,56,11);//设置年月日时分秒
System.out.println("c = " + c);