二十九.线程
1.线程的创建方法
1.进程:一个正在运行的程序,如qq音乐,浏览器等
2.线程: 线程是进程中的一个执行单元。如qq音乐中的播放和下载,可以同时进行
3.关系:在一个进程中可以包含多个线程 ,当需要在同一时间做多件事情,就需要开启多个线程
关键字: Thread (需要被继承) Runnable(接口,需要被实现)
- 开线程必须要用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方法*/@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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 {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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{ //接口 实现@Overridepublic void run() {System.out.println("hahah");}}
class PrimeThread extends Thread{ // 继承@Overridepublic 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 {@Overrideprotected 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.弱引用:不管内存是否充足,都会回收该对象