线程与进程:
进程通常意义上讲为我们运行的一个应用程序 进程由线程组成,一个进程至少包含一个线程进程脱离了线程就没有意义了
创建线程
1通过继承Thread类来实现
public class GameThread extends Thread {
@Override
public void run() {//包装独立的功能
for (int i = 0; i < 100; i++) {
System.out.println(i+" 游戏.....");
}
}
public class MusicThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i+" 音乐.....");
}
}
}
public class Test {
public static void main(String[] args) {
GameThread gt = new GameThread();
MusicThread mt = new MusicThread();
gt.start();
mt.start();
}
}
- 先明确我们需要把什么事情封装成一个线程对象(现有相应的代码)
- 自定义一个类 extends Thread
- 覆写run方法,在这里写1步中的代码
- 创建一个自定义类的对象 t
- 启动线程 t.start();
- 注意执行过程:本质是代码执行到一个位置之后,如果切换到另一个线程,在切换回来,那么会从刚才切换走的代码位置继续执行:产生线程安全问题的原因,就在此...
2通过实现R
public class Game implements Runnable{
public void run() {
System.out.println(游戏);
}
}
public class play implements Runnable{
public void run() {
System.out.println(游戏);
}
}
public class Test {
public static void main(String[] args) {
Play play = new Play();
Thread thread = new Thread(play);
thread.start();
}
}
- 通过查看API得知,Thread当中的run方法不是来自于自身,而是通过实现Runable接口里面的run方法,从而实现某个类的实例,可以通过线程的方式实现功能,类必须定义一个名为run的无参数方法
- 本质Thread也是通过实现接口来实现线程功能的
- 如果自定义一个类,完全可以通过实现该接口从而,通过线程实现功能
Thread的API
构造方法:* (1)Thread(Runnable target)* (2)Thread(String name) 线程名称,即使没有设置线程名称,也有默认的线程名称* public MyThread extend Thread{* //设置线程名称* public MyThread(String name){* super(name);* }* }** 方法:* (1)public static Thread currentThread(); 获取当前线程对象,这个方法在哪个线程中执行的,返回这个线程对象* (2)public final String getName();返回当前线程对象的名称* (3)public void interrupt(); 中断线程* (4)static boolean interrupted(); 测试当前线程是否已经中断。* (5)boolean isDaemon() 测试该线程是否为守护线程。* (6)boolean isInterrupted() 测试线程是否已经中断。* (7)public final void join() 等待该线程终止。* (8)void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。* (9)static void sleep(long millis) ; 让当前正在执行的线程休眠指定毫秒数** (10)static void yield(); 暂停当前线程,执行其他线程* 主动让出cpu的使用权,重新和其他线程平等竞争CPU资源
正则表达式
- 简单说就是一组规则,类似日期格式化设置模式 yyyy-MM-dd
- 不是Java特有的一个东西,不同的开发语言有不同程度的支持
应用场景
应用场景:手机号码用户名密码邮箱身份证
(1)String
matches()
//验证当前字符串对象是否匹配传入的正则表达式字符串
boolean matches(String regex);
System.out.println("aaaaaaaaaab".matches("a*b"));//true
replaceAll()
//根据正则表达式,使用新的字符序列替换原本字符串中匹配的内容,生成一个新的字符串对象返回
String replaceAll(String regex,String newStr);
System.out.println("aaaaa1bbb2bbcc3ccc".replaceAll("\\d","e"));
System.out.println("18888888888".replaceAll("(\\d{3})(\\d{4})
(\\d{4})","$1****$3"));//188****8888
split()
//使用指定正则表达式规则,分割字符串
String[] split(String regex);
System.out.println(Arrays.toString("1a2b3c4e5".split("[a-zA-Z]")))
(2)Pattern
//匹配str这个字符串是否满足regex这个正则表达式规范
static boolean matches(String regex,String str);
System.out.println(Pattern.matches("a*b","aaaaaaaab"))
(3)Matcher
boolean matches();
Pattern pattern = Pattern.compile("a*b");
Matcher matcher = pattern.macher("aaaaab");
System.out.println(matcher.matches());
3
、常见的正则符号
[abc] abc 中的任意一个出现 1 次[^abc] 除了 abc 之外的任意一个字符出现 1 次[0-9] 0-9 这 10 个数字任意一个出现 1 次[a-zA-Z] 所有的字母任意一个出现 1 次[a-zA-Z0-9] 所有的字母和数组任意一个出现 1 次\d 同 [0-9]\D 非数字的字符出现 1 次\s 空白字符出现 1 次\S 非空白字符\w 同 [a-zA-Z0-9]\W 非 \w开始于结束^ 开始$ 结束次数? 0 次或者 1 次* 0 次到多次+ 1 次到多次{n} n 次{n,} 至少 n 次{n,m} 至少 n 次,最多 m 次| 或者() 分组