黑马程序员——Java基础---理解多线程

来源:互联网 发布:财经数据 编辑:程序博客网 时间:2024/06/16 03:43

——— android培训、java培训、期待与您交流! ———

概念

理解多线程,要先知道线程是什么。所谓的线程就是任务,单线程就是一条时间线上只执行一个任务,多线程则是在一条时间线上多任务同时执行。关于线程,还有一个概念叫进程,即从所有要做的任务开始,直到所有任务执行结束,称为一个进程。从理解的角度讲,进程包含着所有线程。

而多线程的秘密在于,多线程其实并非真的让所有线程在cpu上同时分配内存并各自进行运算。一个内核只能同时运行一个任务,那么多线程是怎么做到的?其实多线程只是内核在不断的切换任务执行,比如说一共有a、b、c,3个线程要运行,那么内核就执行一下a,执行一下b,执行一下c,再执行一下b或者其它线程,如此不断切换。而切换的速度太快了,超过了我们能察觉的速度,就好像真的所有的线程都在同时运行一样。


java中的多线程

在java中一个线程在生命周期内会有如下状态:创建、开始、运行或等待运行、结束。

创建线程

最基本的线程类是Thread。

有两种创建线程的方法:

  • 继承Thread类并重写run()方法
  • 在Thread的构造函数中加入Runnable接口的匿名实现作为参数,在实现中重写Runnable的run()方法

第一种方法是继承Thread类,所以这种方法有一个缺点是不能继承其他类,或者说继承了其他类的子类不能作为线程类。而第二种方法不存在这种问题,所以第二种方法一般使用的更多。

代码

  • 继承Thread类并重写run()方法
class MyThread extends Thread{    public void run()    {        //此处是执行代码        ...    }}MyThread mythread = new MyThread();mythread.start();
  • 在Thread的构造函数中加入Runnable接口的匿名实现作为参数,在实现中重写Runnable的run()方法。
Thread thread = new Thread(new Runnable(){    public void run()    {        //此处是执行代码        ...    }});thread.start();

启动和关闭线程

在创建线程后,调用线程对象的start()方法即可开始线程。
线程开始后,调用线程对象的stop()方法即可关闭线程。

代码

//启动线程thread.start();//关闭线程thread.stop();

线程的等待状态

从简单的角度理解线程的等待状态:
因为内核只能同时执行一个线程,而实际不止一个线程需要执行,内核需要一个一个切换着执行。所以实际上整体过程是:所有线程等待——内核选中一个线程——执行此线程——此线程等待,所有线程处于等待状态——内核选中一个线程——执行此线程——此线程等待,所有线程处于等待状态……直到线程一个一个地执行完毕,所有线程都结束。所以在内核执行其中一个线程时,其他线程就在等待被切换。

其实在等待中的线程还有两种状态:执行资格和执行权。执行资格就是可以被内核选中、执行,没有执行资格就是不能被内核选中。执行权就是被内核选中,接下来就要执行。

内核对线程的选择是随机的,受优先级等因素的影响。我们可以强制一个执行中的线程进入等待状态,只需要调用该线程对象的sleep()方法。

  • sleep()
    sleep()方法通过设定时间,在指定时间内该线程处于等待状态,不能被内核选中执行。在指定时间过后,线程依旧处于等待状态,但可以被内核选中执行。
0 0