开启一个线程 相当于开启了一个 CPU的执行路径(相对独立)
CPU在执行多个线程的时候 是随机的 跟线程优先级有关
分时调度 CPU 会在多个线程中 进行随机切换
单线程程序:
程序由上至下依次执行(一个执行完 才会去执行下一个)
好处:数据绝对安全 不牵扯到 操作共享数据
弊端:效率不高
主线程:
主线程的程序 除了主线程以外 一般都叫子线程
一个程序只有一个主线程
main函数 就是一个线程 并且是主线程
主线程(叫main的线程)是如何被执行的
JVM调用main函数 --->CPU就为叫main得函数开辟一个执行路径
--->相当于在这个执行路径中 执行main函数中的代码
Thread线程类(开辟一个主线程以外的线程 子线程)
1.创建一个Thread类的子类
2.重写run方法
run方法就是你要执行的代码
3.调用start方法 开启线程(不能重复开启)
public class Demo02 {
public static void main(String[] args) {
//Exception in thread "main"
//异常出现在 叫main的 这个线程中
//System.out.println(10/0);
//System.out.println("主线程");
//创建一个子线程
//开启多个线程时 多个线程会同时执行
//并且是相对的独立执行单元
SubThread subThread = new SubThread();
//开启线程
subThread.start();
//再开一个子线程
SubThread sbsubThread = new SubThread();
sbsubThread.start();
//主线程 出现异常了 但是并没有影响子线程的执行
//主线程
for (int i = 0; i < 100; i++) {
System.out.println("main--"+i);
}
}
}
//声明一个线程类
class SubThread extends Thread{
//重写run方法
@Override
public void run() {
//子线程默认的名字 Thread-0
//X是从0开始的
System.out.println(10/0);
for (int i = 0; i < 100; i++) {
System.out.println("run---"+i);
}
// 子线程 指定的代码
System.out.println("我是子线程");
}
}
直接调用run方法就相当于调用了一个普通的成员方法
Thread.currentThread(); 获取当前正在执行的线程
线程的创建方式
// 方式1 (用thread子类的方式)
Thread thread = new Thread(){
@Override
public void run() {
System.out.println("子线程执行的方法");
}
};
thread.start();
// 方式2(接口实现类的方式)
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("子线程方法");
}
};
Thread thread2 = new Thread(runnable);
thread2.start();
//方式3 (方式2的两部写在一起)
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("子线程方法");
}
}).start();
线程状态
1.新建状态 new Thread
2.运行状态 start
3.死亡状态 run方法运行完毕
4.受阻塞状态 cpu未执行该线程时
5.休眠状态 sleep方法 休眠事件过了 恢复
6.等待状态 wait notify