多线程--MultiThread

多线程:
  实现同时执行的效果,实际上是多个线程在争抢CPU
  可以实现不同功能的同时执行
  多线程不一定能够提高效率,但是可以合理的使用PCU资源
  多线程的运行结果是不同的,因为线程在争抢CPU,这就是多线程的随机性

概念:

  进程(Process):
  每一个应用程序都会对应一个进程
  正在运行的程序,也就是在内存中开辟的内存空间

线程(Thread):
  负责程序执行的一条执行路径,也称为一个执行单元
  进程的执行实际上是线程在执行
  一个进程至少会有一个线程(Main Thread),主线程执行main函数代码
  当一个进程中有多个线程时,就是多线程程序

任务(Task):
  每个线程需要执行的代码
  任务代码都有其存储位置
  主线程的任务代码在main函数,垃圾回收线程的任务代码在finalize函数中

线程是随着任务的存在而存在,随着任务的结束而消失

/**
*
*   JVM(Java 虚拟机)是不是多线程?
*
*   至少有一个负责正常执行的线程,也就是执行main函数中的代码----主线程
*   还有一个负责垃圾回收的线程,也就是执行finalize函数中的代码----垃圾回收线程
*
*   **每个对象都可以被回收,回收的功能定义在Object的finalize()方法中
*   **运行垃圾回收器,调用System的gc()方法
*
**/

创建线程的第一种方式:
  1 创建一个类继承Thread
  2 重写Thread类中的run方法
    创建线程是为了执行任务
    任务代码必须有存储位置,run方法就是任务代码的存储位置
  3 创建子类对象,实际在创建线程
  4 启动线程
    主线程的任务代码在main函数中
    子线程的任务代码在run函数中                  

  

  

**run()方法只是一个普通的方法调用,不具备启动线程的功能
**start()方法会启动线程并执行run()中的代码
**currentThread()方法返回当前的线程对象

/**
*
*   为什么不能直接创建Thread类,然后调用start方法?
*
*   任务代码必须写在run方法中,而Thread类中的run方法没有实现任何功能,代码执行没有结果
*   所以只有继承Thread类,重写run方法
*
**/

多线程内存:
  在栈中为主线程开辟内存
  多线程不遵循先进后出,每个线程在栈中都有内存,谁先获得CPU,就先执行
  当线程执行完自己的任务代码,线程就从栈中消失
  只有所有线程都结束,整个进程才结束

创建线程的第二种方式:
  为了解决临界资源的问题,需要使用创建线程的第二种方式
  1 创建实现了Runnable接口的子类
  2 重写Runnable接口的run方法
  3 创建实现了Runnable接口的子类的对西航
  4 创建Thread类的对象,也就是创建线程
  5 把实现了Runnable忌口的子类对象作为参数传递给Thread的构造方法

**把线程任务进行了描述,也就是面向对象
**实现了线程任务和线程对象的分离,线程执行什么任务不再重要,只要实现了Runnable接口的子类对象都可以作为参数传递给Thread的构造方法
**实现了接口的同时还可以继承父类

线程的生命周期:
  

/**
*
*   为什么创建线程的第二种方式可以解决卖票问题?
*
*   第一种创建线程的方式:线程和线程任务是绑定在一起的,创建4个线程就创建了4份资源
*   第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行
*
**/

synchronized代码块的锁:obj
同步函数的锁:this
静态同步函数:
静态函数进内存的时候不存在对象,但是存在其所属类的字节码文件,属于Class类型的对象,所以静态同步函数的锁是其所属类的字节码文件对象

避免死锁:
  容易发生在锁的嵌套

线程间的通信:
  线程间的任务不同,但是线程操作的数据相同
  有共享数据
  操作共享数据的代码超过一句

等待唤醒机制:
  
  wait() notify() notifyAll()
  必须用在同步中,因为同步中才有锁
  指明让持有锁的线程去等待或被唤醒
  等待的线程会放弃锁

  

**sleep()方法使线程进入挂起(冻结),人为
**wait()方法进入等待状态,将线程放入线程池
**notify()方法唤醒线程池中的任意一个线程,允许空唤醒,即没有要唤醒的对象
**notifyAll()方法唤醒所有线程

/**
*
*   wait(),notify(),notifyAall()为什么定义在Object中?
*
*   wait(),notify(),notifyAall()必须用在同步中,因为同步中才有锁
*   锁是任意对象,任意对象都可以调用的方法需要定义在Obbject中
*
**/

时间: 2024-08-03 02:57:16

多线程--MultiThread的相关文章

Linux多线程实践(9) --简单线程池的设计与实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

iOS开发--多线程 并行开发

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS 多线程详解

iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作: 对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续执行,用户同样可以继续进行其他UI操作,与此同时前一个操作的后续任务可以分散到多个空闲CPU中继续执行(当然具体调度顺序要根据

iOS多线程 NSThread/GCD/NSOperationQueue

http://www.cnblogs.com/kenshincui/p/3983982.html iOS开发系列--并行开发其实很容易 2014-09-20 23:34 by KenshinCui, 9738 阅读, 19 评论, 收藏,  编辑 --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种

iOS多线程基本使用

大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

iOS开发系列--并行开发其实很容易多线程

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS开发系列--并行开发其实很容易

--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后

iOS下的并行开发

在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续执行,用户同