Math类、Date、SimpleDateFormat,验证码,自定义线程
日期类 Date
Calendar
日期格式化类 SimpleDateFormat
作用1: 可以把日期转换成指定格式的字符串 format()
作用2: 可以把一个字符串转换为对应的日期 parse()
注意:把一个字符串转换成对应日期,指定的字符串的格式必须要跟SimpleDateFormat的模式一致
代码演示:
import java.util.Calendar;
public class Demo13 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.print("年:"+calendar.get(Calendar.YEAR));
System.out.print(" 月:"+(calendar.get(Calendar.MONDAY)+1));
System.out.print(" 日:"+calendar.get(Calendar.DATE));
System.out.print(" 时:"+calendar.get(Calendar.HOUR_OF_DAY));
System.out.print(" 分:"+calendar.get(Calendar.MINUTE));
System.out.print(" 秒:"+calendar.get(Calendar.SECOND));
}
}
运行结果:
需求:显示 当前系统时间: 2014年12月26日 xx时xx分xx秒
代码演示:
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String time = dateFormat.format(date);
System.out.println("当前系统时间:"+time);
String brithday = "2022年02月12日 11:27:54";
Date date1 = dateFormat.parse(brithday);
System.out.println(date1);
运行结果:
Math 数学类,主要是提供了很多的数学公式。
abs(double a) 获取绝对值
ceil(double a) 向上取整
floor(double a) 向下取整
round(float a) 四舍五入
random() 产生一个随机数,大于等于0,但小于1.0的伪随机数double值
代码演示:
public class Demo14 {
public static void main(String[] args) {
System.out.println("绝对值:"+Math.abs(-3));
System.out.println("向上取整:"+Math.ceil(3.14));
System.out.println("向下取整:"+Math.floor(-3.14));
System.out.println("四舍五入:"+Math.round(3.54));
System.out.println("随机数:"+Math.random());
}
}
运行结果:
随机数类
Random
需求:编写一个函数随机产生四位的验证码。
代码演示:
import java.util.Random;
public class Demo15 {
public static void main(String[] args) {
/* Random random = new Random();
int randomNum = random.nextInt(10)+1;
System.out.println("随机数:"+randomNum);*/
char[] arr = {'吴','春','婷','凤',};
StringBuffer ss = new StringBuffer();
Random random = new Random();
for (int i=0;i<3;i++){
int inde = random.nextInt(arr.length);
ss.append(arr[inde]);
}
System.out.println("验证码:"+ss);
}
}
运行结果:
进程:正在执行的程序称作为一个进程。进程负责了内存空间的划分。
问题:Windows号称是多任务的操作系统,那么Windows是同时运行多个应用程序吗?
从宏观的角度:Windows确实是同时运行多个应用程序。
从微观角度:cpu是做了一个快速切换执行的动作,由于速度太快,所以我感觉不到在切换而已。
线程:线程在一个进程中负责了代码的执行,就是进程中一个执行路径,
多线程:在一个进程中有多个线程同时在执行不同的任务。
疑问:线程负责了代码的执行,我们之前没有学过线程,为什么代码可以执行呢?
运行任何一个java程序,jvm在运行的时候都会创建一个main线程执行main方法中所有代码。
一个java应用程序至少有几个线程?
至少有两个线程,一个是主线程负责main方法代码的执行,一个是垃圾回收期线程,负责了回收垃圾。
多线程的好处:
1,解决了一个进程能同时执行多个任务的问题。
2,提高了资源的利用率,
多线程的弊端:
1,增加cpu的负担,
2,降低了一个进程中线程的执行概率。
3,引发了线程安全问题。
4,出现了死锁现象
如何创建多线程:
创建多线程的方式:
方式一:
1,自定义一个类继承Thread类
2,重写Thread类的run方法,把自定义线程的任务代码写在run方法中
疑问:重写run方法的目的是什么?
每个线程都有自己的任务代码,jvm创建主线程的任务代码就是main方法中的所有代码,自定义线程的任务代码就是写在run方法中,自定义线程负责了run方法中的代码。
3,创建Thread的子类对象,并且调用start方法开启线程、
注意:一个线程一旦开启,那么线程就会执行run方法只能的代码,run方法千万不要直接调用,直接调用run方法就是相当于调用了一个普通的方法而已并且没有开启新的线程。
代码演示:
public class Demo16 extends Thread{
@Override
public void run() {
for (int i = 0;i<1000;i++){
System.out.println("自定义线程:"+i);
}
}
public static void main(String[] args) {
Demo16 d = new Demo16();
d.start();
for (int i = 0;i<1000;i++){
System.out.println("main线程:"+i);
}
}
}
运行结果: