zoukankan      html  css  js  c++  java
  • java-多线程(上)

    多线程简单入门(Java)(上篇:概念理解)

    本篇文章会简单地介绍一下多线程的相关概念,多线程的实现方法(这里我将会用大量的代码实例来介绍),多线程的应用场景以及经典的生产者消费者问题。通过这篇文章,我们将会对多线程有初步的理解;本文中讲上篇,建议结合下篇学习。

    一、什么是多线程?什么时候用到多线程?多线程的优点是什么?

    多线程首先是一个操作系统中的概念。首先我们来区分一下:程序、进程、线程。程序,显而易见,是一段静态代码。它是一组指令的集合,采用某种语言编写的,比如java语

    言,目的是完成一种特定的功能。

    进程一个抽象实体,当它要执行某个任务时,将要分配和释放各种资源。进程是资源分配的基本单位。它是一个动态的过程,它动态地被创建,并被调度执行后消亡。例如:一

    个正在运行的QQ进程,一个运行着的播放器进程。但是我们发现QQ的运行和播放器是可以同时运行的,所以,进程具有并发性。在不考虑资源共享的情况下,各进程的执行是独立的,

    执行速度是异步的。用一句话概括一下,进程是一个程序对某数据集的执行过程,是分配资源,CPU调度的基本单位。

    线程:线程是一个程序内部的一条执行路径,是进程的一部分。那么,若一个进程同一时间并行执行多个线程,就形成了多线程。

    线程:起初引入线程的概念,主要是为了减少进程切换和创建的开销。因为对于线程而言,它和进程都是CPU调度的基本单位,但是线程与计算机软硬件资源的分配无关。线程只能共

    享它所属进程的资源。使用线程的最大好处就是在有多个任务需要CPU处理机处理时可以减少处理机的切换时间。

    多线程:一个进程中的多个线程,它们共享相同的内存单元/内存地址空间。它们从同一个堆中分配对象,可以访问相同的变量和对象,这就使得线程间通信更简便高效,但是,

    多个线程共享也会带来安全隐患。对于单核CPU来说,并没有实现真正的多线程。因为在一个时间单元内,只能执行一个线程的任务。此时的多线程其实多个线程交替地执行,只不过

    它们执行的速度非常快,我们感觉好像是在同时执行。那对于多核CPU,便会真正地实现多线程。

    什么时候用到多线程?

    1、程序需要同时执行两个或者多个任务的时候;

    2、程序需要实现一些需要等待的任务时,如用户输入,文件读写操作,网络操作,搜索等。

    3、需要一些后台运行的程序时。

    多线程的优点是什么?

    1、提高应用程序的响应,对图形化界面更有意义,可增强用户体验。

    2、提高计算机系统的CPU利用率。

    3、改善程序结构,将既长又复杂的进程分为多个线程,独立运行,利于理解和修改。

    二、线程的生命周期

    线程有五种状态:新建,就绪,运行,阻塞,死亡。下面是线程的生命周期图示:

    三、线程的安全,线程的同步与互斥。

    线程为什么会有安全问题?是因为多个线程执行的不确定性会引起执行结果的不稳定性。比如多个线程操作同一个储蓄账户,而没有保护机制,会导致操作的不完整性。举个例子,假

    如两个人去同时去取钱,卡里只有1000。甲想取1000,但是因为某种原因,取完钱后该取钱的线程正好被阻塞,导致账户余额还没有冲减,乙执行,乙也取了1000.那这样的话,甲乙

    都取了1000.那么此时账户余额变为-1000.这就是出现了线程的不安全问题。

    解决的办法就是:线程的同步。同步就是协同步调,按照预定的先后次序进行运行。线程同步是指多线程通过特定的设置(如互斥量,事件对象,临界区)来控制线程之间的执行顺序

    (即所谓的同步),也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间是各自运行各自的!接着上面的例子,也就会等待甲全部操作完了以后,乙才

    可以对账户进行操作。

    线程互斥是指对于共享的进程系统资源,在多个线程访问时的排他性。当有若干个线程都要使用某一共享资源时,任何时刻最多只能允许一个线程使用,其他需要使用该资源的线程必

    须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

    四、线程的死锁问题

    死锁是如何产生的?死锁的起因是并发进程的资源竞争。把不同的线程分别占有对方需要的同步资源不放弃,都需要等待对方放弃自己所需要的同步资源,便形成了线程的死锁。

    五、线程通信:生产者消费者问题

    问题描述:把并发进程的同步和互斥问题一般化,可以得到一个抽象的一般模型,即生产者-消费者问题。计算机系统中,每个进程都申请使用和释放各种不同类型的资源,这些资源

    可以是外设、内存及缓冲区,也可以是临界区、数据和例程等软件资源。把系统中使用某一类资源的进程称为资源的消费者,而把释放同类资源的进程称为资源的生产者。

    首先,生产者消费者问题是一个同步问题,它们之间有一个有界缓冲区。即生产者和消费者必须满足如下条件:

    (1)消费者想接收数据时,有界缓冲区中至少有一个单元是满的;

    (2)生产者想发送数据时,有界缓冲区中至少有一个单元是空的。

    另外,由于有界缓冲区是临界资源,因此,各生产者和各消费者进程之间必须互斥执行。

    学习让我快乐,工作让我快乐。学习和工作都是为了更好的生活!
  • 相关阅读:
    容器 list
    迭代器
    排序
    extern "C"
    FZU2127
    HDU1102--最小生成树
    HDU1102(最小生成树Kruskal)
    并查集详解(转自一个很有才的大神)膜拜
    C# switch
    Dijkstra(歪果仁的名字真是长。。。)
  • 原文地址:https://www.cnblogs.com/xyuanzi/p/13969327.html
Copyright © 2011-2022 走看看