线程
线程组成了程序执行中的进程,一个进程可以包含多个子线程,主线程只有一个(Main主方法执行后,JVM会为其开辟一个主线程),进程就是程序的执行
对讲机:说话的时候不能收到声音,收声音的时候不能讲话(单线程)
学会创建子线程,子线程是在主线程中开启的...
1、子线程的创建方式
第一种:继承Thread类,重写run方法**
run方法的方法体内就是子线程要执行的程序代码
![image-20220719114337073](Img\image-20220719114337073.png)
```java
/**
线程创建的方式一
* 继承Thread类,重写run方法
*/
public class Demo01 {
public static void main(String[] args) {
System.out.println("-->主线程开启..");
//创建子线程对象
ThreadA t1 = new ThreadA();
ThreadA t2 = new ThreadA();
//t1.run();//相当于调用普通方法,开启线程用start()
t1.setName("子线程01");//设置线程名字
t1.setPriority(10);//设置线程优先级
t2.setName("子线程02");
t2.setPriority(5);
t1.start();//开启子线程
t2.start();//开启子线程
}
}
/**
* 自定义的子线程类
*/
class ThreadA extends Thread{
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(this.getName()+":"+i);
}
}
}
```
**第二种:实现Runnable类,重写run方法**
比较麻烦,Thread线程就是Runnable接口的实现类(子类)
Runnable缺乏线程启动的方法,需要封装Thread才能运行
```java
/**
第二种:实现Runnable类,重写run方法**
*/
public class Demo02 {
public static void main(String[] args) {
System.out.println("-->主线程开启..");
//创建Runnable接口的实现类 子线程类ThreadB
ThreadB tb1 = new ThreadB();
tb1.setName("Runnable01");
ThreadB tb2 = new ThreadB();
tb2.setName("Runnable02");
//启动
Thread t1 = new Thread(tb1);//封装到Thread中,为了能启动
Thread t2 = new Thread(tb2);//封装到Thread中,为了能启动
t1.start();
t2.start();
}
}
/**
* 子线程类ThreadB
*/
class ThreadB implements Runnable{
private String name;
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println(this.name+":"+i);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
第三种:匿名子线程**
```java
//子线程对象
Thread t1 = new Thread(){
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println("匿名子线程:"+i);
}
}
};
t1.start();
```
**线程如何停止**
线程对象调用stop()
**柜台商品管理(实现了数据的持久化)**
虽然我们手动退出会备份保存,每过10秒自动备份