1.多线程的概念
进程的概念
进程是操作系统结构的基础;是一次程序的执行,它是系统进行资源分配和调度的一个独立单位。
线程
线程可以理解为在进程中独立运行的子任务。比如QQ进程在运行中,有很多子任务同时运行,如,好友视频线程,下载文章线程,数据传输线程等。
单任务的特点就是排队执行,也就是同步。多线程是系统运行效率大大提升,使用多线程就是使用异步。
继承Thread类
在java的JDK开发包中,已经自带了对多线程技术的支持。实现多线程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。
Thread类的结构:如下
从上面的源代码中可以发现,Thread类实现了Runnable接口,他们之间具有多态关系。
使用继承Thread类的方式创建多线程时,最大的局限就是不支持多继承,因为java的语言特点就是单继承,所以要实现多继承,完全可以实现Runnable接口的方式。用两种方式创建的线程工作时性质是一样的,没有本质区别。
继承Thread的第一个Demo
run方法执行的时间比较晚,说明使用多线程技术,代码的运行结果与代码的执行顺序或调用顺序是无关的。
线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法
异步原理:Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程就是让系统安排一个时间来调用Thread中的run方法。
线程的启动顺序和执行顺序无关
实现Runnable
如果欲创建的线程已经有一个父类了,这时就不能再继承自Thread类了,因为Java不支持多继承,所以就需要实现Runnable接口
实例变量与线程安全
自定义线程类中的实例变量针对其它线程可以有共享和不共享之分,这在多个线程之间进行交互时是一个技术点
不共享数据的情况
共享数据的情况是多个线程可以访问一个变量,比如实现投票功能的软件时,多个线程可以同时处理同一个人的票数
非线程安全:多个线程对同一个对象中的同一个实例变量就行操作时会出现值被更改,值不同步的情况。
CurrentThread()方法
currentThread()方法可以放回代码正在被哪个线程调用的信息。
MyThread.java类中的构造函数是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是自动调用的方法
isAlive()方法
方法isAlive()的功能是判断当前线程是否处于活动状态。
当线程已经启动并且尚未终止,该线程处于活动状态。
有关多线程中this.getName()和Thread.currentThread().getName()返回名字不一样的问题
至于这里为什么两次this.getName都是Thread-0,我当时就很郁闷,为什么会出现这样的情况呢,,死活想不通,那是因为由于惯
性思维的原因,一直是以为它也是某个线程的名字,然而相同之后却很简单
因为this代表的是当前类这个对象,this.getName()其实就是最简单的方法调用,然而当前对象里面没有这个方法,
又因为继承了Thread方法,所以它执行的就是Thread父类的方法,父类方法如下:
public final String getName() { return String.valueOf(name); }
public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); }
到这里你应该明白了吧,,Thread-0就是上面init()方法将name的值设置进去。。。
sleep()方法
方法sleep()的作用是在指定的毫秒数内让当前正在执行的线程进行休眠
这个正在执行的线程是指this.currentThread()返回的线程。
getId()方法
getId()方法的作用是去的线程的唯一标识。