一、线程
线程组成了程序执行中的进程,一个进程可以包含多个子线程,主线程只有一个(Main主方法执行后,JVM会为其开辟一个主线程),进程就是程序的执行
对讲机:说话的时候不能收到声音,收声音的时候不能讲话(单线程)
学会创建子线程,子线程是在主线程中开启的…
1、子线程的创建方式
第一种:继承Thread类,重写run方法
run方法的方法体内就是子线程要执行的程序代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZYVCVy3-1658669177264)(Img\image-20220719114337073.png)]
public class Demo01 {
public static void main(String[] args) {
System.out.println("--主线程开始..");
//创建子线程对象
ThreadA t1 = new ThreadA();
ThreadA t2 = new ThreadA();
t1.setName("子线程01");//设置线程名
t1.setPriority(7);//设置优先级1-10
t2.setName("子线程02");
t2.setPriority(10);
//线程的启动,不是run方法,而是start方法
t1.start();
t2.start();
// for (int i = 1; i <= 10000; i++) {
// System.out.println("主线程:" + i);
// }
}
}
/**
* 自定义子线程类
*/
class ThreadA extends Thread{
@Override
public void run() {
//run方法体就是子线程流程代码部分
System.out.println(this.getName()+" 子线程开始...");
for (int i = 1; i <= 100; i++) {
System.out.println(this.getName()+":" + i);
}
}
}
第二种:实现Runnable类,重写run方法
比较麻烦,Thread线程就是Runnable接口的实现类(子类)
Runnable缺乏线程启动的方法,需要封装Thread才能运行
public class Demo02 {
public static void main(String[] args) {
//创建ThreadB子线程对象
ThreadB t1 = new ThreadB();
ThreadB t2 = new ThreadB();
t1.setName("ThreadB01");
t2.setName("ThreadB02");
//Thread类有start启动,把实现Runnable接口的实现类对象,封装为Thread类
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
//启动线程
th1.start();
th2.start();
}
}
/**
* 方式二:自定义子线程
*/
class ThreadB implements Runnable{
private String name;
@Override
public void run() {
//run方法体就是子线程流程代码部分
System.out.println(this.getName()+" 子线程开始...");
for (int i = 1; i <= 100; i++) {
System.out.println(this.getName()+":" + i);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第三种:匿名子线程
Thread t = new Thread(){
@Override
public void run() {
}
};
t.start();
线程如何停止
线程对象调用stop()
## 2、子线程使用案例
柜台商品管理(实现了数据的持久化)
虽然我们手动退出会备份保存,但是如果程序突然关闭,数据是没有保存的
添加子线程每过10秒自动备份
/**
* 用来备份的子线程
* 启动这个子线程后,在后台不停的运行,每过10秒就备份一次
*/
public class BackupGoods extends Thread{
private Counter counter;
@Override
public void run() {
while(true){
counter.updateFile();
//类似日志记录
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.println(time+" 完成一次备份...");
try {
//线程休眠
Thread.sleep(10*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public Counter getCounter() {
return counter;
}
public void setCounter(Counter counter) {
this.counter = counter;
}
}
售票员卖票
ounter getCounter() {
return counter;
}
public void setCounter(Counter counter) {
this.counter = counter;
}
}
**售票员卖票**