我是靠谱客的博主 壮观花瓣,这篇文章主要介绍线程和垃圾回收机制,现在分享给大家,希望可以做个参考。

二十九.线程

1.线程的创建方法

1.进程:一个正在运行的程序,如qq音乐,浏览器等

2.线程: 线程是进程中的一个执行单元。如qq音乐中的播放和下载,可以同时进行

3.关系:在一个进程中可以包含多个线程 ,当需要在同一时间做多件事情,就需要开启多个线程

关键字: Thread (需要被继承) Runnable(接口,需要被实现)

  1. 开线程必须要用thread类当中的strat()方法

5.如何创建线程

方式一:

1.在java中main函数被称为主线程 多个线程之间的执行是互不影响的

​ 2.在程序中运行出现的错误,如果没有处理会立马结束主程序,但是主程序中开了独立的线程

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ThreadDemo { public static void main(String[] args) { SubThread thread = new SubThread(); thread.start();//线程中的任务不需要手动调用,而是通过start方法在创建并开启线程后自动调用的 int a = 1 / 0; } } class SubThread extends Thread { /** * 创建方式一 run方法用于定义该线程要执行的任务 虚拟机会自动调用run方法 */ @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程中的任务"); } } }

方式二:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class ThreadDemo { public static void main(String[] args) { //实现Runnable接口是为了定义任务 Runnable subrun = new SubRun(); //多态 //此处的Thread对象是用于创建并开启线程的,它当中是没有指定任务的 Thread thread = new Thread(subrun); thread.start(); int a =1/0; } } class SubRun implements Runnable { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程中的任务"); } } }

问: 两种方式应该选哪一种?

答:选第二种,选择继承的话就意味这该此类不能在继承其他类,扩展性不好(继承只能单继承,接口的实现是可以多实现)

5.同时执行多线程

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class ThreadDemo2 { public static void main(String[] args) { //要执行的任务 PrimeRun primeRun = new PrimeRun(); //需求:同一个任务需要多个线程去执行,创建一次开一个线程 Thread t1 = new Thread(primeRun); t1.start(); //t1.start();这样是一个线程开启了多次 Thread t2 = new Thread(primeRun); t2.start(); //继承得到的是两个不同的任务,没有意义 /*PrimeThread primeThread = new PrimeThread(); primeThread.start(); PrimeThread primeThread2 = new PrimeThread(); primeThread2.start();*/ } } class PrimeRun implements Runnable{ //接口 实现 @Override public void run() { System.out.println("hahah"); } } class PrimeThread extends Thread{ // 继承 @Override public void run() { System.out.println("hehe"); } }

使用继承方法,只能是单继承,创建对象也是得到两个不同的任务,所以如果要实现多线程,就采用Runnable实现.

2.垃圾回收机制

1.垃圾回收机制是java虚拟机中自动执行的一个线程

2.当程序中存在垃圾对象需要回收的时候,垃圾回收期会自动进行回收,但是回收是不定时的

第一点:并不是有垃圾就立马回收

第二点: 对于垃圾是否需要回收,需要先判断是否为可回收/是否需要回收

3.问题1:如果程序中存在了垃圾,如何通知垃圾回收器进行回收

答:使用System类中的 gc()方法 ,用于通知,对于每个实体类而言,其本身都自带了执行垃圾回收的功能

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class RubbishThread { public static void main(String[] args) { new User(); new User(); new User(); new User(); new User(); new User(); //通知垃圾回收机制回收垃圾 System.gc(); new User(); new User(); } } public class User { @Override protected void finalize() throws Throwable { System.out.println("执行垃圾回收"); super.finalize(); } }

4.问题2: 到底那种对象才能被确定为垃圾对象

答:新生代用于生命周期短的对象,经历过多次回收后仍然存在的,当其内存慢的号死后,回将其复制到老年代中,当老年代中的内存也满的时候,就会直接触发Full gc进行清理

java中的类等静态资源都是存放在持久代中的
在这里插入图片描述

面试题1:final、finally、finalize的区别

final修饰的变量叫常量,只能赋值一次

final修饰的放大叫最终方法,不能被重写

final修饰的类叫最终类,不能被继承

finally是异常汇总的一部分,最终必然会执行的代码块

finalize是垃圾回收机制的执行方法

面试题2:说说垃圾回收机制

答:问题1、问题2

其他知识点:

1.强引用:当内存不足时,垃圾回收器也不会回收强引用的对象

2.软引用:当内存充足时不回收,内存不足时,会回收该对象

3.弱引用:不管内存是否充足,都会回收该对象

最后

以上就是壮观花瓣最近收集整理的关于线程和垃圾回收机制的全部内容,更多相关线程和垃圾回收机制内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部