进程:是一个正在执行中的程序。
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。
线程就是在控制着进程的执行。
一个进程中至少有一个线程。
Java VM 启动的时候会有一个进程 java.exe
该进程中至少有一个线程负责java程序的执行。
而且这个线程运行的代码存在于main方法中。
该线程称之为主线程。
拓展:
在我们接触线程不深的时候,我们觉得JVM的启动貌似是单线程的,我们主观的感受只有main函数在执行,但是其实不然,因为我们知道java有自己的垃圾回收机制,其实在虚拟机启动的时候,垃圾回收机制就自动的启动运行了,所以其实在虚拟机运行这个进程中至少有两个及以上的线程。
还有类似Thunder 一样的P2P软件,他们是多线程最好的代表,因为他们在启动下载的时候,不会只从一台服务器上下载资源,他们会从多台服务器上下载资源的不同部分。所以必然是多线程的。
多线程的意义:
让我们的程序产生同时运行的效果;
或许大家会问多线程有什么意义
例如:
比如JVM中利用多线程实现垃圾回收机制同时运行
按理说我们可以让执行main函数的主线程进行垃圾回收,然后可以让线程保持在一个,就不用考虑多线程的问题了。但是这里就能凸显出多线程的好处,试想如果只有一个线程的话,管理main的主线程,在发现程序执行过程中,垃圾将内存空间占满了,就要停止执行程序,倒过来从头执行垃圾回收,这样显得就不够合理了。
相反,将垃圾回收的程序分离出来,形成一个新的线程,和主线程形成多线程,执行一次清理一次,就显得要合理的多。
多线程图解 一个线程要经历的生命周期:从被创建 到运行 到冻结 到消亡 期中还有一个不明确但一直存在的状态 就是阻塞
通过继承Thread类之后的线程实现类或者直接new一个Thread对象,可以完成一个线程对象的创建。
每个线程在new对象的时候,就会有自己的名称和标识符:Thread自己提供的方法有getName、setName、getId(但是没有setId:因为要保证标识符唯一)
如果没有用setName进行修改线程的名字的话,默认的是以:Thread-*来表示的,例如:
Thread-0、Thread-1、Thread-2 ... ...
Thread中提供了静态的currentThread(); 方法
package day2;
publicclassTest2{
publicstaticvoidmain(String[]args){
MyThread1m=newMyThread1("mzy");
m.start();
}
}
classMyThread1extendsThread{
// private String name;
MyThread1(){}
MyThread1(Stringname){
super(name);
}
publicvoidrun(){
// 通过使用super父类引用来调用父类中的getName可以
System.out.println(super.getName()+"在运行");
// 通过使用this当前对象来调用父类中的getName也可以
System.out.println(this.getName()+"在运行");
/**
* 因为currentThread的作用就是利用静态类名直接返回当前对象的引用
* 所以其实通过super、通过this或者是通过static的currentThread
* 得到父类中的对象的引用其实都是一个对象,所以最后的返回值为true
* 但是使用this.getName();不是通用的方式,但是通过 * Thread.currentThread().getName();
* 进行调用的话,就是通用的方式,也是最标准的方式
*
*/
System.out.println(Thread.currentThread().getName());
System.out.println((Thread.currentThread()==this)+"..."+this.getName ()+"\trun...");
}
}