线程(Thread)
现在的电脑都是多核的,所以能够并行的处理一些事务,这并不难理解,但是在单核机的时代,计算机早就“一心多用”了,那么这是怎么实现的呢。
一、概念
线程就是进程中的一条单一的顺序控制流。进程就是进行中的程序,就是计算机要完成的任务,而线程,就是完成这个任务过程中的某一系列步骤,步骤之间必须顺序执行,不能并行。所以也是计算机资源调度的最小单位。
做个简单的比喻,比如你今天的任务是做番茄蛋花汤,那么这就是你的进程,然后做汤需要步骤是这样:
1、食材拿出
2、切菜打蛋
3、烧水放菜
这样就做好了汤。但是这样时间有些长,我们可以改进一下
先烧水,然后就先不管(线程1),然后拿出食材,切菜打蛋,最后在放菜(线程2),这样烧水和拿食材以及处理食材就实现了并行,节省了时间。
二、应用
1.线程的实现和启动
继承Runnable接口实现
public class YourThread implements Runnable{
//属性...
//实现run方法
public void run() {
//这个方法里面就是待会启动线程之后会执行的语句
}
...
//主函数运行过程中(或者主函数调用的函数中)
//创建对象
YourThread a=new YourThread();
//创建线程对象,并且传入对象
Thread threadOne=new Thread(a);
//调用线程对象的start()方法
threadOne.start();
继承Thread类实现
public class YourThread extends Thread{
//属性...
//实现run方法
public void run() {
//这个方法里面就是待会启动线程之后会执行的语句
}
...
//主函数运行过程中(或者主函数调用的函数中)
//创建继承的对象
YourThread ThreadOne=new YourThread();
threadOne.start();
线程的生命周期
1.线程被创建的时候就是新生状态:拥有自己的内存空间(实例化)
2.调用start()方法后进入就绪状态:线程进入线程池就绪队列,等待系统分配cpu资源
3.得到cpu资源后进入运行状态:根据执行run(),如果执行到yield()或者系统分配的cpu时间片用完,就会回到就绪状态
4.如果遇到join()\wait()\sleep()\suspend()\IO请求,就会进入阻塞状态:退出就绪队列,直到收到消息回到就绪状态
5.如果在任何2.3.4状态中该线程被调用了stop方法,或者在运行中出现了无法处理的异常,就会进入死亡状态:该状态不可逆,只能等待JVM(Java virtual Machine)回收线程。
注:
yield()让当前线程让出cpu资源
join()让当前线程加入和其他线程合并成一个线程(加入其他线程的末尾)
wait()让当前线程等待,直到收到notify()的提醒,sleep()和suspend()类似,两者区别在于对象锁,内容比较深,可自行学习。
IO请求就是等待网络输入,键盘,鼠标等外设输入。