线程基本概念(一)
线程计划 --概念详解篇一--
1.什么是线程
概念:在一个程序中同时运行的多个独立的流程,每一个独立的流程就是一个线程。
进程:程序启动后,进程就开始运行 ,一个进程对应一个程序,但是一个进程里包含了多个(至少一个)线程(独立的流程)。
单线程程序:一个程序进程中只包含一个线程。
多线程程序:一个程序进程中包含多个线程。
线程入口:线程人口就是main方法,我们现在所写的都是单一线程。
2.线程的分类:
主线程: 一个进程启动后,它只有一个线程,这个线程就是主线程
子线程: 主线程中,可以创建更多的线程,而这些更多的线程就是子线程。用户自己创建的线程。
3.线程开发的方式:
1) 自定义一个类,让这个类去继承一个线程类(Thread) ,,实现Thread类的一个方法,叫做run() 即可.
----->继承线程类
class A extends Thread {
//实现Thread类中的run方法
public void run() {
//里面就是线程该做的事情。
}
}
------> 启动线程使用线程的start()方法
------> 结论:线程结果随机
------->为什么随机:原因就是:线程是相互争抢资源,谁能抢到cpu,就可以得到优先的运行,其他线程只能等待,
当cpu的时间片到期了,大家又开始抢,谁抢到谁运行。
2) 实现Runnable接口,即可
------>实现接口
class B implements Runnable {
public void run() {
//里面是线程做的事情
}
}
------> 主方法调用:
B b=new B();
或是
Runnable r=new B();
有没有运行的方法,start()? no
对于实现runnable接口的线程,若要使用start()方法启动线程,则必须按以下操作进行;
1)先产生一个线程类对象
Thread t=new Thread();
2)把刚才得到的接口对象的名字放入Thread的构造方法中即可
Thread t1=new Thread(t);
3)启动线程
t1.start();
问题1: 若线程不掉用start()启动,而直接调用run方法? 这个结果是否一样?
注意点: 不要直接去调用run方法,这和调用普通方法并没有差别,结果固定.
4.线程的状态
1)初始状态 : 调用start(),让线程成为可运行
2)可运行状态 :(要让cpu来选择到底谁能运行 )
3)运行状态 :调用 run()方法来让线程运行 ,从运行到可运行是cpu时间片已经到期。
4)终止状态 : 线程死亡
最后组成一张图:
初始-----(调用start()方法)--->可运行---(执行run())-->运行-->(程序执行完毕)-->终止
<------------cpu时间片到期
5.线程状态中 有一个很重要的状态: 休眠状态(阻塞状态)
休眠状态的经典方法:
1) join: 加入: 若有线程调用了此join方法,则会让此线程先执行完毕。
2) sleep: 可以让低优先级的 线程得到执行的机会。 它这个方法中加入的时间是无法精准控制的。
6. join方法举例
有2个线程,一个叫Thread1,一个叫Thread2
现在要求在Thead1中要加入Thread2,让Thread2先运行,然后Thread1再运行。