概述
二十九.线程
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方法
*/
@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.弱引用:不管内存是否充足,都会回收该对象
最后
以上就是壮观花瓣为你收集整理的线程和垃圾回收机制的全部内容,希望文章能够帮你解决线程和垃圾回收机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复