Java基础笔记33-线程、垃圾回收机制
1.线程
简介
-
进程:就是运行的一个程序,比如Eclipse,浏览器等
-
线程:线程是进程中的一个执行单元,比如音乐播放器中的播放和下载音乐就分属两个线程
-
关系:一个进程中可以包含多个线程,当需要一个程序同时运行多个功能时,可以开启多个线程。
-
关键词
- Thread 是一个类,继承此类之后,可以创建一个线程,通过 start() 方法可以开启线程
- Runnable 是一个接口,可以结合Thread类创建并开启线程。
-
创建线程的方式
1.继承Thread类,通过start方法创建并开启线程(常用)
2.实现Runnable接口,结合Thread类创建并开启线程(常用)
3.实现Callable接口,通过Executor执行
4.通过线程池
代码示例:
public class ThreadDemo {
public static void main(String[] args) {
//创建一个新线程
SubThread th1 = new SubThread();
//线程开始,线程中的run()方法会自动运行
th1.start();
//使用继承开两个线程是每个线程都需要一个对象来运行
SubThread th2 = new SubThread();
th2.start();
//使用子类创建一个实现Runnable实例,
Runnable runn = new SubRunnable();
//使用Thread将上述实例转换为线程
Thread ru1 = new Thread(runn);
//线程开始运行
ru1.start();
//使用实现方式开两个线程是一个对象在两个线程中使用
Thread ru2 = new Thread(runn);
ru2.start();
}
}
/**
* 继承Thread类,创建线程方法
*
*/
class SubThread extends Thread{
/**
* 线程中的run()方法用于定义该线程中要执行的任务
* 线程中run()方法不需要手动调用,在使用start()方法开启线程时,会自动调用
*/
@Override
public void run() {
//死循环,用于演示线程输出
for(;true;) {
out();
System.out.println("继承Thread后重写的run方法");
}
}
//私有方法,演示方法调用
private void out() {
System.out.println("SubThread中的私有方法");
}
}
/**
* 实现Runnable来创建线程
*
*/
class SubRunnable implements Runnable {
@Override
public void run() {
//死循环演示输出
while(true) {
System.out.println("SubRunnable中的run方法");
}
}
}
- 线程中的 run() 方法用于定义该线程中要执行的任务
- 线程中 run() 方法不需要手动调用,在使用 start() 方法开启线程时,会自动调用
- 多个线程之间的运行是互不影响的
2.垃圾回收机制
- 简介
- 虚拟机的内存是有限的,因此,对于在程序运行过程中创建的对象(占用的资源),虚拟机需要对其进行监控,当发现有对象不再有引用的时候就将其进行回收,该回收的动作是贯穿整个程序的,它是一个单独的线程,称该线程为垃圾回收机制。
- 垃圾回收机制是java虚拟机中自动执行的一个线程
- 当程序中存在垃圾对象需要回收的时候,垃圾回收器会自定进行回收,但是,回收是不定时的
- 第一点是:并不是有垃圾了就立马回收
- 第二点是:对于垃圾是否要进行回收,需要先判断其是否为可回收(需要回收)的垃圾
- 在System类中有一个方法叫gc(),用于通知的,对于每个实体类而言,其本身都自带了执行垃圾回收的功能
- 垃圾回收算法
- 在垃圾回收机制中定义了很多回收算法,比较典型的是年代算法,其中分新生代、老年代及持久代
- 新生代用于生命周期短的对象,经历过多次回收之后仍然存在的,当其内存满的时候,会将其复制到老年代中,当老年代中的内存也满的时候就直接出发Full gc进行清理
- java中的类等静态资源都存放在持久代中的
代码示例
class User {
//重写垃圾回收时执行的方法,可用于演示是否执行了垃圾回收操作
@Override
protected void finalize() throws Throwable {
System.out.println("执行垃圾回收");
super.finalize();
}
}
public class GarbageCollectionDemo {
public static void main(String[] args) {
new User();
new User();
new User();
new User();
new User();
//gc()方法用于通知垃圾回收机制进行垃圾回收,但时机由垃圾回收器决定
System.gc();
}
}
- 垃圾回收中的四种引用方式简介
- 强引用:当内存不足时,垃圾回收器也不会回收强引用的对象
- 软引用:当内存充足时不回收,内存不足时,会回收该对象
- 弱引用:不管内存是否充足,都会回收该对象
- 虚引用:用于跟踪垃圾回收器的回收活动