多线程

Posted wbh1996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

DAY23

java命令运行一个java程序的过程:

a.其实java命令,他启动了一个jvm进程

b.该jvm进程,在执行的时候,首先会创建一个线程,main线程

c.在main线程中,运行主类中的main方法代码

 

jvm是多线程

 

在无线循环运行过程中,始终看不到一个内存溢出的错误,为什么呢?

1.其实,因为while循环的每次循环中,都在堆上new出一个数组,并且用一个在while玄幻体重声明的局部变量引起变量指向该数组

2.这意味着,每一个在while循环中创建的数组,再一次循环体执行完毕之后,就变成了垃圾

3.而同时,jvm中,其实还有另一个线程,运行着我们的垃圾回收器

 

 

Thread实现方式之一:

1.继承Thread

2.在子类汇总重写父类(Thread)的run方法

3.创建该子类的对象

4.启动线程 start()

 

注意事项:

1.一个Thread类(Thread子类)对象代表一个线程

2.为什么我们重写Thread类的run方法

结论——>只有Thread run()方法中的代码,才会执行在子线程中

为了保证,子线程中运行的是我们想要在子线程中运行的代码

3.但是,如果想要让代码,在子线程中运行,并非一定代码要写在run方法方法体中,对于定义在Thread子类中,其他方法方法体中的代码,也可以运行在子线程

换句话说,一个方法,被哪个线程中的代码调用,被调用的方法,就运行在调用它的线程里。

4.启动线程,必须使用start()方法来启动,这样才能是Thread中的run方法运行在子线程中,如果通过调用run方法,来执行Thread的run方法,这仅仅只是普通的方法调用

5.同一个Thread或Thread子类对象(代表同一个线程),只能被启动一次,如果我们要启动多个线程,只能创建多个线程对象,并启动这些线程对象

 

 

线程实现的第二种方式:

1.定义实现Runable接口的子类

2.实现Runable接口的run方法(写在runable接口子类run方法中的代码,才会运行在子线程中)

3.创建该子类对象

4.在创建Thread对象的时候,将创建好的Runable子类对象作为初始化参数,传递给Thread对象

5.启动Thread对象(启动线程)

注意事项:

1.我们Runable接口子类的run()方法代码,会运行在子线程当中

2.所以在线程的第二种实现方式中,我们自己定义子类,实现Runable接口的run方法,将要在子线程中执行代码。方法run方法中

3.但是,Runable子类对象,并不代表线程,它只代表,要在线程中执行的任务

 

我们认为,从逻辑上说,第二种方法逻辑十分清晰:

1.线程就是一条执行路径,至于在线程这条执行路径上,究竟执行的是什么样的具体代码,应该和线程本身没有关系

2.也就是说,线程和在线程(执行路径)上执行的任务应该是没有什么直接关系的

3.线程实现的第二种方式,把线程(Thread对象代表线程)和在线程上执行的任务(Runable子类对象)分开

 

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)