线程的概念
程序:
程序其实就是一段静态的代码,他是进程执行的蓝本。
进程:
进程就是程序的一次动态执行。(在操作系统中,程序并不能单独的执行,作为资源分配和独立运行的基本单位都是进程。进程是一个具有一定独立功能的程序关于某个数据集合的动态执行过程.进程是操作系统进行调度和资源分配的基本单位。)
进程特点:
- 动态性:进程与程序的区别在于程序只是一段静态的代码,而进程是代码的动态执行。
- 并发性:多个进程在一个CPU中并发执行。(一个CPU在某一个时刻只能做一件事情,我们为什么可以同 时使用QQ,Word,听音乐…其实是CPU在多个进程中不停的切换,只不过CPU速度很快,我们感觉是同时执行)
- 独立性:进程是系统中进行调度和资源分配的基本单位,每个进程都可以拥有自己的资源,自己的空间,进程单独执行
线程:(子进程)
线程是进程内部的一个执行单元。他是程序中的一个单一的流程控制。如果在一个进程中 同时运行多条线程,就叫做多线程。(eg:eclipse软件执行起来就是一条进程,eclipse中可 以同时敲代码,还可以同时代码提醒,代码错误检测…这就是多线程。)
创建多线程的两种方法
- 继承Thread类,重写run方法。
语法:
class Test extends Thread{
//重写run方法
public void run(){
//方法体
}
}
- 实现Runnable接口,实现run方法。
语法:
class Test implements Runnable{
//实现run方法
public void run(){
//方法体
}
}
启动线程:
新建的线程不会自动启动,必须通过start()方法启动(注意:不要直接调用run()方法,直接调用run方法不会启动线程,而变成普通的方法调用,记住多线程中永远不要调用run方法)
方法一:
Test t = new Test();
t.start();//启动线程
方法二:
Test t = new Test();
Thread th = new Thread(t);
th.start();//启动线程
注意:一条线程不能启动多次,否则会报IllegalThreadStateException异常。
说明:
Java程序运行时,会立即创建主线程(main),如果程序没有启动其他线程,则改程序就是单线程;如果启动了新线程,则该程序就是多线程。
两种创建线程的方法对比:
方法 | 优点 | 缺点 |
---|---|---|
继承Thread类 | 简单 | 不可以再继承其他类;无法实现资源共享 |
实现Runnable接口 | 可以继承其他类;可以实现资源共享 | 复杂 |
Java线程五大状态
- 新建状态(New):
使用new关键字创建类一个对象后,在尚未调用start()方法前。
当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码 - 就绪状态(Runnable)
调用了线程的start()方法后(注意:不是一调用start方法就立即执行线程,必须等到线程获得cpu资源才执行) - 阻塞状态(Blocked)
一个正在运行的线程因为某些特殊的情况而导致暂停(eg:打印机缺纸,等到用户输入信息….),阻塞时线程会让出CPU资源。后面如果特殊情况得到解决(eg:往打印机中加纸了,用户输入完成…..),线程从阻塞变到就绪态,等待CPU调度 - 运行状态(Running)
就绪状态的线程获得CPU资源就到了运行状态 - 死亡状态(Dead)
线程运行结束,线程自动死亡。或者线程运行中发生Exception或Error时线程也会死亡。