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

概述

二十九.线程

1.线程的创建方法

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

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

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

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

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

5.如何创建线程

方式一:

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

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

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("线程中的任务");
		}
	}

}

方式二:

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.同时执行多线程

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()方法 ,用于通知,对于每个实体类而言,其本身都自带了执行垃圾回收的功能

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.弱引用:不管内存是否充足,都会回收该对象

最后

以上就是壮观花瓣为你收集整理的线程和垃圾回收机制的全部内容,希望文章能够帮你解决线程和垃圾回收机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部