多线程

作者: 不小心丢了 | 来源:发表于2019-11-10 17:42 被阅读0次

    线程概述

    计算机同时完成多项任务的技术,就是线程技术。Java是支持多线程的语言之一,它内置了对多线程技术的支持,可以使程序同时执行多个执行片段。

    进程

    在学习线程之前需要先了解一下什么是进程。在一个操作系统中,每个独立执行的系统都可称为进程,也就是“正在运行的程序。目前大部分计算机上安装的都是多任务操作系统,即能够同时执行多个应用程序,最常见的有Windows、Linux、UNIX等。在Windows操作系统下,单击任务栏,选择启动任务管理器选项就可以打开任务管理器面板,在窗口的进程选项卡中可以看到当前正在运行的程序,也就是系统所有的进程。

    在多任务操作系统中,表面看是支持进程并发的,例如可以一边听音乐,一边聊天,但实际这些进程并不是同时运行的。在计算机中,所有的应用程序都是由CPU执行的。对于CPU而言,在某个时间点只能运行一个程序,也就是说只能执行一个进程。操作系统会为每一个进程分配一段有限的CPU使用时间,CPU在这段时间中执行某个进程,然后会在下一段时间切换到另一个进程中去。由于CPU运行速度很快,在极短的时间内在不同的进程之间进行切换,所以给人以同时执行多个程序的感觉。

    线程

    每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行。这些执行单元可以看做程序执行的一条条线索,被称为线程。操作系统中的每一个进程中都至少存在一个线程。例如当一个Java程序启动时,就会产生一个进程,该进程中会默认创建一个线程,在这个线程上会运行main()方法中的代码。

    在前面所接触过的程序中,代码都是按照调用顺序依次往下执行的,没有出现两段程序代码交替运行的效果,这样的程序称作单线程程序。如果希望程序中实现多段程序代码交替运行的效果,则需要创建多个线程,即多线程程序。所谓多线程是指一个进程在执行过程中可以产生多个单线程,这些单线程在运行时是相互独立和进程一样的,它们可以并发执行。

    多条线程看似是同时执行的,其实不然,它们和进程一样,也是由CPU轮流执行的,只不过CPU运行速度很快,故给人同时执行的感觉。

    线程的创建

    在Java中如何实现多线程呢?

    在Java中提供了两种多线程实现方式,一种是继承java.lang包下的Thread类,覆写Thread类的run()方法在run()方法中实现运行在线程上的代码;另一种是实现java.lang.Runnable接口,同样是在run()方法中实现运行在线程上的代码

    单线程程序

    继承Thread类创建多线程

    实现Runnable接口创建多线程

    两种实现多线程方式的对比分析

    继承Thread类和实现Runnable接口都能实现多线程,那么这两种实现多线程的方式在实际应用中又有什么区别呢?

    假设售票厅有4个窗口可以发售某日某次列车的100张车票,这时,100张车票可以看做共享资源,4个售票窗口需要创建4个线程。为了更直观显示窗口的售票情况,可以通过Thread的currentThread( )方法得到当前的线程的实例对象,然后调用getName()方法可以获取到线程的名称。

    从上面可以看出,每张票都被打印了4次。出现这种现象的原因是4个线程没有共享100张票,而是各自出售了100张票。在程序中创建了4个TicketWindow对象,就等于创建了4个售票程序,每个程序都有100张票,每个线程都在独立地处理各自的资源。需要注意的是,每个线程都有自己的名字,主线程的名字默认的名字是“main”,用户创建的第一个线程的名字默认为“Thread-0”,依此类推。

    由于现实中铁路系统的票资源是共享的,因此上面的运行结果显然不合理。为了保证资源共享,在程序中只能创建一个售票对象,然后开启多个线程去运行同一个售票对象的售票方法。简单来说就是4个线程运行同一个售票程序,这时就需要用到多线程的第二种实现方式。

    对以上代码进行修改,并使用构造方法Thread(Runnable target,String name)在创建线程的同时指定线程的名称。

    只创建了一个TicketWindow对象,然后创建了4个线程,在每个线程上都去调用这个TicketWindow对象中的run()方法,这样就可以确保4个线程访问的是同一个tickets变量,共享100张车票。

    实现Runnable接口相对于继承Thread类来说,有如下显著的好处。
    1.适合多个相同程序代码的线程去处理同一个资源的情况,把线程与程序代码、数据有效的分离、很好地体现了面向对象的设计思想。
    2.可以避免由于java单继承带来的局限性。

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/ogfaectx.html