进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间。
线程:进程中的一个执行单元,负责进程中的程序的运行,一个进程至少要有一个线程。
一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
程序启动了多线程,有什么应用呢?
答:可以实现多部分程序同时执行,称之为并发;备注:在某一时刻只会有一个进程在进行,由于CPU切换的频率比较快到时我们平成感觉是同时进行的。
多线程的使用可以合理使用cpu的资源,如果线程过多会导致性能降低。
CPU处理程序时是通过快速切换完成的,在我们看来好像是随意一样,但是CPU有着自己的计算方法。
下面通过代码来进行演示:
在如下的代码中,jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束。这个线程在java中称之为主线程。
当主线程在这个线程中执行时,如果遇到循环导致在指定位置停留时间过长,无法执行下面的程序。解决这个问题我们实现主线程解决一个循环,由另一个线程负责其他代码的执行。实现多部分代码同时执行,这就是多线程技术可以解决的问题。
如何在java中创建线程呢?
看文档java api中的thread类中的描述,创建线程有两种方式:
1.继承Thread类
1.1定义一个类继承Thread
1.2重写run()方法
1.3创建一个子类对象,就是创建线程对象
1.4调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。
为什么不直接调用run()方法?
答:如果直接调用run方法,在java中以栈的形式来存放,它将会先把mian()方法放入栈中,然后在放一个run()方法,接下来在上面的列子中首先是d1调用,执行完了之后,d2调用,这样变成了顺序执行,结果还是存在循环问题。是的主线程还是负责两个线程。如图:
更改如下图:
这样的结果还是没有什么变化,这是因为主线程创建完对象之后,开始执行d1.run()方法,在这还是没有对d2.run()方法进行开启,所以结果还是没有什么变化。所以要在d1.run()方法调用前应该调用d2.start()方法,对d2的线程先开启这样就可以了。