现在的我们打开电脑,可以同时运行多个程序,比如、在听音乐的同时,还在聊天,当然还有玩游戏等等。
大家打开任务管理器工具后,就能点到进程选项卡,就会发现:我们没有运行多少个程序,但是,在列表里面,一般都多达几十个进程。每
一个进行都对应一个应用程序。然后,再点到性能选项卡,看到左下角的总数分组框中,会发现:线程数远远多于进程数。
这是为什么呢?就是因为,我们的程序,如果是多进程,同样能够同时运行很多程序,但是,进程是直接 独占 硬件资源的,所以,进程
数越多,电脑的剩余资源就越少,电脑就越慢。但是我们同一个程序,能同时做很多事情,比如,QQ聊天软件,在和这人聊天的同时,另一个
好友发信息来了,是不是都能同时收到?难道,每一个窗口,都要去开一个独立的进程?那样的话,如果,聊天的窗口一多。电脑都只能聊QQ
了。。。但是我们发现,即使QQ的聊天窗口很多,但是卡的话,只会QQ卡,其他程序不会卡。这是为什么呢?这里就引入了我们的线程!
为什么需要线程呢?
有些任务必须由线程来执行,像播放器在播放的时候,调用一个线程去播放,肯定还要能够在播放的时候,可以暂停或停止,那么这些按钮
功能也要有线程来和播放同步执行。
一些任务可以在后台运行
一些任务本身是多线程的,像播放视频的时候,肯定还要有声音吧?那一个线程播放画面,另一个线程播放声音。
一些任务可以被细分,从而接受并行处理。
那么什么是线程呢?我们可以把一个线程看成一个独立的虚拟的小电脑。这个虚拟的小电脑由我们来创建,并让它按照我们的控制流去执行
。而所有的线程都是在进程内部的,所以,线程分享的是进程分得硬件的资源。也就是说,线程再多(这里用到了再多,就是表明了,线程可以
创建多个的),也不会影响除包含该线程的进程以外的程序。
那么线程既然这么好,是不是很难呢?我们来看看线程的两种方式:
方式一:继承Thread类
//继承Thread类
public class MyThread extends
Thread{
//重写Thread实现的Runnable的run方法,因为Thread自身也实现了Runnable接口
public void
run(){
//这里写上我们创建了该线程后,要执行的代码
}
public static void main(String [] args){
MyThread mt =
new MyThread();
//注意,我们这里调用的是start方法,是因为,线程创建以后,还要做一系列的初始化工作,这些工作就交给了start方法,初始化完毕后
,start会自动调用run方法。
mt.start();
}
}
方式二:实现Runnable接口
public class MyRunnable implements Runnable{
//重写Runnable的run方法
public void run(){
//这里写上我们创建了该线程后,要执行的代码
}
public static void main(String [] args){
//得到MyRunnable对象
MyRunnable mr = new MyRunnable();
//创建一个MyRunnable的线程对象
Thread t = new Thread(mr);
//启动线程
t.start();
}
}
线程的生命周期:新建一个对象---->调用start方法让线程就绪--->运
行---->结束(死亡)
↑
|
|
|
|
↓
←-----------------------阻塞
至于线程的同步等问题,后续再讲解。欢迎大家指正~~~