------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、理解线程
进程:每个独立执行的程序称之为进程。
线程:线程就是一个进程内部的一条执行路径。
多线程:在java虚拟机启动的时候会有一个java.exe的执行程序,也就是一个进程。该进程中至少有一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。JVM启动除了执行一个主线程,还有负责垃圾回收机制的线程。像种在一个进程中有多个线程执行的方式,就叫做多线程。
线程和多线程区别如下:
(1)每个进程都有独立的代码和数据空间,进程间的切换开销大。
(2)同一进程内的多个线程共享相同的代码,每个线程有独立的运行栈和程序计数器,线程间的切换开销小。
二、创建线程的方式
创建线程共有两种方式:继承方式和实现方式(简单的说)。
1、 继承方式
通过查找java的帮助文档API,我们发现java中已经提供了对线程这类事物的描述的类——Thread类。这第一种方式就是通过继承Thread类,然后复写其run方法的方式来创建线程。
创建步骤:
(1),定义类继承Thread。
(2),复写Thread中的run方法。
目的:将自定义代码存储在run方法中,让线程运行。
(3),创建定义类的实例对象。相当于创建一个线程。
(4),用该对象调用线程的start方法。该方法的作用是:启动线程,调用run方法。
注:如果对象直接调用run方法,等同于只有一个线程在执行,自定义的线程并没有启动。
Thread类用于描述线程。该类就定义了一个功能,用于存储线程要执行的代码。该存储功能就run方法。也就是说,Thread类中的run方法,用于存储线程要运行的代码。
程序示例:
class MyThread extends Thread{ // 继承Thread类,作为线程的实现类 private String name ; // 表示线程的名称 public MyThread(String name){ this.name = name ; // 通过构造方法配置name属性 } public void run(){ // 覆写run()方法,作为线程 的操作主体 for(int i=0;i<10;i++){ System.out.println(name + "运行,i = " + i) ; } } }; public class ThreadDemo01{ public static void main(String args[]){ MyThread mt1 = new MyThread("线程A ") ; // 实例化对象 MyThread mt2 = new MyThread("线程B ") ; // 实例化对象 mt1.run() ; // 调用线程主体 mt2.run() ; // 调用线程主体 } };
执行结果如下:
从此处的效果来看,确定是并发执行的,那个线程抢占到了CPU资源,那个线程就执行。
三、线程的生命周期
四、线程的几种状态
被创建:等待启动,调用start启动。
运行状态:具有执行资格和执行权。
临时状态(阻塞):有执行资格,但是没有执行权。
冻结状态:遇到sleep(time)方法和wait()方法时,失去执行资格和执行权,sleep方法时间到或者调用notify()方法时,获得执行资格,变为临时状态。
消忙状态:stop()方法,或者run方法结束。
注:当已经从创建状态到了运行状态,再次调用start()方法时,就失去意义了,java运行时会提示线程状态异常。
如图:
五、总结
1.进程与线程的区别。
线程是在进程的基础上划分的。
线程消失了进程不会消失,进程如果消失了,则线程肯定会消失。
2.java进程实现的两种方式
继承thread类
实现Runnable接口
3.线程的启动:通过start()方法完成,需要进行cpu调度,调用state()实际上调用的就是润()方法
4.Thread类也是runnable的子类,实用了代理的机制完成。
5.在实用多线程的实现中建议通过rennable接口实现,这样可以避免由于但继承所带来的开发局限,而且通过是使用Runnable接口也可已达到资源共享的目的。
来源:https://www.cnblogs.com/bhqitheima/p/4939856.html