黑马程序员技术交流社区
标题:
Java中的多线程
[打印本页]
作者:
wx348602984
时间:
2015-4-21 22:44
标题:
Java中的多线程
基本概念
线程:是依赖于进程的执行绪(执行路径/控制单元),是程序使用CPU的基本单位。
进程:当前正在执行的程序,代表一个应用程序在内存中的执行区域。
多进程:同一时间段内执行多个任务。同一时刻只能执行一个任务。如Windows为代表的操作系统。
多进程并不提高某个程序的执行速度,仅仅是提高了CPU的使用率。真正的多进程执行是指多核同时计算。
单线程:一个进程中,只有一个线程执行。
多线程:同一个进程中,多个线程执行。这多个线程共享该进程资源(堆内存与方法区),单栈内存独立,即每一个线程占用一个栈。
线程两种调度模型:
分时调度模型 所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片。
抢占式调度模型 优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个。(线程随机性)
Java使用的为抢占调度模型。
线程并行与线程并发
线程并行:正常的多线程执行就是线程并行。即逻辑上同一时间同时运行。
线程并发:由于线程抢占而不应出现的某一时刻的线程及相关数据状态。如并发修改异常的产生。
JVM的启动支持多线程:
JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。
Java命令会启动java虚拟机,启动JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程”,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。
多线程实现方式
方式一:继承Thread类
自定义线程类继承Thread类。
重写run方法。run方法内为该线程执行代码。将其理解为其他线程的main方法,即该线程的执行入口。
使用:
创建线程对象
开启线程,即调用start方法,该方法会自动调用这个线程的run方法。
方式二:实现Runnable接口
自定义Runnable 的子类(非线程类)。
重写run方法。run方法内为该类对象所在线程的执行代码。同样可将其理解为其他线程的main方法,即该线程的执行入口。
使用:
创建Runnable的子类对象。
使用Runnable的子类对象创建线程对象。
开启线程,即调用start方法,该方法会自动调用这个线程的run方法。
方式一与方式二的区别
方式一:当类去描述事物,事物中有属性和行为。如果行为中有部分代码需要被多线程所执行,同时还在操作属性。就需要该类继承Thread类,产生该类的对象作为线程对象。可是这样做会导致每一个对象中都存储一份属性数据。无法在多个线程中共享该数据。加上静态,虽然实现了共享但是生命周期过长。
方式一:如果一个类明确了自己的父类,那么它就不可以再继承Thread。因为java不允许类的多继承。
方式二:将线程与运行的业务逻辑分离,可以让多个线程共享业务逻辑中的数据。
方式二:可以让业务类不再继承Thread而专注于业务继承其他类,避免了单继承的局限性。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2