一.两种创建线程的方式
1.继承Thread类(匿名内部类)
创建方式:
1.定义一个子类继承Thread,重写run方法
2.创建子类对象,
3.调用子类对象的start方法(启动还是执行的run方法)
优缺点:
1.编码简单
2.只能继承Thread,无法继承其他类,不利于功能扩展
2.实现Runnable接口
创建方式:
1.定义一个任务类实现Runnable接口,重写run()方法
2.创建任务类对象
3.把任务类对象交给Thread来处理
4.调用线程对象的start执行
优缺点:
1.可以继承其他类 实现其他接口,扩展性强
2.需要Thread还需要多一个Runnable对象
3.匿名内部类
二.线程和进程的区别
1.定义:
线程和进程是操作系统中进行任务管理和资源分配的基本单元,
- 进程(Process):是程序的一次执行实例,是资源分配的基本单位。每个进程都有独立的地址空间、数据段、代码段和堆栈段。
- 线程(Thread):是进程中的一个执行单元,是CPU调度和执行的基本单位。一个进程可以包含多个线程,它们共享进程的资源(如内存、文件句柄等)。
2.区别:
1.一个进程可以包含多个线程,线程在进程的内部。
2.进程之间的资源是独立的,线程之间的资源则是共享的。
每个进程都有独立的虚拟地址空间,也有之间独立的文件描述符表,同一进程的多个线程之间则共用这一份虚拟地址空间和文件描述符表。
3.进程是操作系统中资源分配的基本单位,线程是操作系统中调度执行的基本单位。
4.多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。
5.进程的上下文切换速度比较慢,而线程的上下文切换速度比较快。
6.进程的创建/销毁/调度开销大,线程的创建/销毁/调度开销相对少很多。
三.synchronized
1.定义:
synchronized 是 Java 中的关键字,是一种同步锁。主要应用于多线程环境下保证线程的安全性。
2.用法:
1.修饰代码块:
被修饰的代码块称为同步语句块,其作用的范围是大括号{} 括起来的代码,作用的对象是调用这个代码块的对象;
2.修饰方法:
被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,因此,synchronized 关键字不能被继承。如果在父类中的某个方 法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这 个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上 synchronized 关键字才可以。当然,还可以在子类方法中调用父类中相应的方 法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此, 子类的方法也就相当于同步了。
3.修饰静态方法:
其作用的范围是整个静态方法,作用的对象是这个类的 所有对象;
4.修饰一个类
其作用的范围是synchronized后面括号括起来的部分,作用对象是这个类的所有对象。