码迷,mamicode.com
首页 > 编程语言 > 详细

多线程--MultiThread

时间:2017-08-05 16:52:02      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:虚拟   cpu   类型   代码块   ges   不同   存在   单元   obb   

多线程:
  实现同时执行的效果,实际上是多个线程在争抢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中
*
**/

 

多线程--MultiThread

标签:虚拟   cpu   类型   代码块   ges   不同   存在   单元   obb   

原文地址:http://www.cnblogs.com/roxy/p/7290497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!