多线程程序扩展了多任务操作的概念,它将多任务操作降低一级来运行,那就是各个程序似乎是在同一个时间内执行了多个任务。每个任务通常称为一个线程,它是控件的线程的简称。
可以将每个线程是为是在一个不同的环境中运行的,也就是说这些环境看上去好像是每个线程都有自己的cpu一样,该cpu配有寄存器、内存和他自己的代码。
java创建线程的方法:
1、继承Thread类
应用这种形式创建线程对象时不用给出任何参数。继承Thread类最重要的是要重写run()方法,称为线程体,它是整个线程的核心,线程所要完成的任务都要定义在线程体中,实际上不同功能的线程之间的区别就在于线程体的不同。
2、实现Runnable接口
这种方法主要就是继承Runnable接口,并且去实现run()方法,在创建线程的时候,需要先声明一个接口,然后传给线程类中,这样子来创建。
这两种创建方式的比较:
1、java是单继承的,如果继承了Thread,就不可以继承其他的类,因此会使用继承接口的方式
线程的调度:
1、New Thread状态
线程已经被创建、实例化完毕,但还未启动,此时线程体(run()方法)未被执行;当线程已经启动时,线程调度器可为其分配cpu空间
2、Runnable状态
处于可运行但尚未得到cpu时间的状态,调用了start()方法之后,为该线程完成登记工作和分配资源工作,此时该线程处于Runnable状态。
3、Running状态
线程调度器为其分配了cpu时间,处于运行状态,该状态可与其他状态进行转换。
4、Wait/Block状态
等待某个时间发生,一旦发生之后就离开该状态,进入Runnable状态。通常在调用sleep或wait方法时进入该状态,I/O阻塞时也可能进入该状态,或者发生在多线程同步访问时。
5、Dead状态
run方法执行完毕后,线程就处于Dead状态了,非预期的异常也会导致run方法的终止。死亡的线程不可重新启动,此时的线程对象与普通对象没有区别。
6、离开阻塞状态
如果一个线程进入了sleep状态,那么直到所规定的毫秒数结束,才能离开该状态,进入Runnable状态;
如果I/O阻塞,则等操作完成后才能离开该状态;
当一个线程调用了wait方法,那么只能有另一个线程调用notify或者notifyAll方法才能离开该状态;
如果因为多线程同步引起阻塞,则需要得到对象锁时才能离开该状态。
线程的启动:
t.start();
结束线程:
1、自然消亡:run方法结束
2、强制死亡:stop方法
线程交互:
为了让线程对一个对象调用wait()或者notify(),线程必须锁定那个特定的对象,这时候就需要使用同步机制加以保护。也就是说,只能在它们被调用的实例的同步块内使用wait()和notify()。在调用这些方法时,必须保证持有该对象的锁定标志。
挂起线程:
sleep():此方法是一个使线程暂时停止执行一段时间的方法。在sleep时间间隔期满后,线程通常不是立即恢复执行。因为此时,其他线程可能正在运行而且没有被调度为放弃执行,除非有以下几种情况发生:
1、这个被唤醒的线程具有更高的优先级
2、正在运行的线程因为其他原因而阻塞