




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五小阶段多线程GUI网络编程反射及新特性Day23多线程(上)菜单线程的基本概念线程的创建和启动线程的实现方式线程的安全问题同步锁其他扩充内容进程(process)什么是进程?Ctrl+Shift+Esc 打开windows任务管理器进程是操作系统动态执行和资源分配的一个基本单元,就是程序执行的过程,在这个过程中会占用内存空间和CPU资源。在操作系统中,程序的体现就是进程。一个程序至少有一个进程,一个复杂的应用程序可能启动并使用多个进程,例如谷歌Chrome浏览器、腾讯的QQ等采用的就是多进程架构设计。进程间相互独立,不能互相访问或共享资源相关性,看你CPU的核心有几个(双核处理器、四核处理
2、器、八核处理器)看一下自己的电脑中的进程及相关性吧线程(thread)线程是比进程更小的能独立运行的基本单位,它是进程的一部分一个进程可以拥有多个线程,但至少要有一个线程,即主执行线程(java的main方法),我们之前写的都是单线程程序。线程不能够单独执行,它必须运行在处于活动状态的进程中,它可与同属一个进程的其他线程共享进程所拥有的全部资源生活案例:1. 火车可以拥有多节车厢,但至少要有一节车厢,火车就是进程,每个 车厢就是一个线程2. QQ可以打开多个聊天窗口,QQ就是进程,每个聊天窗口就是一个线 程多线程编程在一个程序中能让两个for循环同时执行吗?一个进程中的多个线程可以并发(同时)
3、执行,因此用多线程编程即可解决这个问题。有必要搞多个线程吗?有什么用?多线程编程能解决什么问题?在一些执行时间长、需要等待的任务上(文件读写和网络传输等),多线程就比较有用了。例如:多图片上传方案1:一张一张来方案2:多张同时开始(多线程编程)多线程是为了共享内存、充分利用CPU,是为了同时完成多项任务,是为了提高资源(内存和CPU)使用率从而提高程序的执行效率。CPU与多线程一心无二用,一个人能同时干多件事情吗?(边看片儿边写字)那计算机是怎么实现的呢?真正的“同时”几乎是不存在的,CPU在以极快的速度随机轮流执行程序,专业说法是程序在快速轮流抢占CPU资源。速度太快,人感觉不到。一个(程序
4、)进程中如果只有一条生产线,这个程序称为单线程。一个(程序)进程中如果有多条生产线,这个程序称为多线程。class Demo extends Thread /生产线 (线程类)public void run()for(int x=30; x50; x+) System.out.println(Thread-+x);class ThreadDemo public static void main(String args) /主线程(必须有的)Demo d1 = new Demo(); /创建一个生产线(线程)d1.start(); /启动线程for(int x=0; x30; x+) Syste
5、m.out.println(main-+x);多执行几次观察结果胶片电影用Java实现多线程C+这种语言传统上一直是性能之王。但是,C+对多线程技术的支持非常有限。标准C+甚至没有提到线程这个概念。要想使用C+开发多线程程序是非常困难的。Java从一开始就在语言层面上支持多线程。使用Java编写多线程的程序是非常简单的。因此,基本上所有的Java程序,包括J2ME、J2SE、J2EE程序都支持多线程技术。在传统单核、单进程CPU上,Java多线程程序在性能上无法与C+单进程程序相比。但是,随着多核、超线程CPU时代的到来,将成就Java性能之王的地位!Java中有两类线程:User Threa
6、d(用户线程)、Daemon Thread(守护线程或后台服务线程) 。守护线程的作用是为其他线程的运行提供服务,比如说GC线程。在Java中实现多线程有两种方式:方式一. 继承Thread类方式二. 实现Runnable接口方式一java.lang.Thread是Java提供的线程类,我们通常可以借助于它来实现多线程编程。实现步骤:自定义线程类即生产线(继承Thread类)重写Thread类中的run()方法,把希望能同时运行的代码放在run()方法中。创建生产线,即创建线程类的对象并调用start()方法启动生产线该类常用方法:public long getId(),获得该线程的标识符(线
7、程 ID) ,它在创建该线程时生成。线程 ID 是唯一的,并终生不变。public final void setName(String name),给线程命名,不命名的话都有默认的,格式为:Thread-0、Thread-1.public final String getName(),获得线程的名字public void start(),使该线程开始执行,JVM会自动调用该线程的 run() 方法。public static void sleep(long millis),让线程休眠(暂停)多少毫秒public static Thread currentThread(),获得当前正在执行的线程
8、对象的引用。(方式二会用到)多线程执行流程每个Java程序都有一个默认的主线程。Java程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法后就启动一个线程,这个线程就称作主线程,该线程负责执行main方法。在main方法中再创建的线程就是其他线程。如果main方法中没有创建其他线程,那么当main方法执行完时JVM就会结束Java应用程序。但如果main方法中创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU资源,即使main方法结束(主线程结束)JVM也不会结束,要一直等到该程序所有线程全部结束才结束Java程序注意CPU的随机
9、性,主线程不一定先执行,“主”的意思是它是必须存在的课堂案例用方式一实现两个学生同时看书(10页/100ms)需要同时执行的功能是什么谁是线程类(生产线)需要创建几条生产线并启动方式二java.lang.Runnable接口是Java提供的实现多线程编程的另一种方式,该接口只定义了一个无参的run方法。具体实现步骤:创建假线程类即假生产线,覆盖Runnable接口中的run方法,把希望能同时运行的代码放在run()方法中。创建生产线,即通过Thread类创建一个线程(构造方法需要一个线程类对象)。启动生产线,即调用Thread类对象的start方法开启线程。class Shengchanxia
10、n implements Runnable /创建线程类(不是真正的生产线)public void run()for(int j=0; j30; j+) System.out.println(Thread.currentThread().getName()+-+j);class Demopublic static void main(String args) /主线程Shengchanxian scx=new Shengchanxian();Thread t1=new Thread(scx); /创建第一个生产线t1.start(); /启动Thread t2=new Thread(scx);
11、 /创建第二个生产线t2.start(); /启动课堂案例用方式二实现两个学生同时看书(10页/100ms)需要同时执行的功能是什么谁是线程类(不是真正的生产线)创建几条生产线(Thread类)并启动小结两种实现方式的对比: 1.由于Java只支持单一继承,所以方式一的弊端显而易见2.但是方式一更简单易懂,方式二有点复杂线程安全问题1线程安全问题2public class SaleWindow implements Runnable private int ticket = 10; / 车票编号,共享资源 public void run() for (int i = 1; i = 1) Sys
12、tem.out.println(Thread.currentThread().getName() + 卖编号+ ticket + 票); ticket - -; Thread.sleep(500); / 模拟卖票速度,半秒一张 public static void main(String args) SaleWindow sw = new SaleWindow();new Thread(sw).start(); / 窗口1new Thread(sw).start(); / 窗口2 多执行几次观察结果模拟实现:除夕那天北京到郑州的动车票只剩下10张,两个窗口同时在卖解决线程安全问题出现线程安全问
13、题的主要原因是:线程之间是独立的,多个线程之间共享的数据不同步判断多线程程序是否存在安全隐患:1. 代码中存在共享数据2. 多个线程可能同时操作共享数据解决线程安全问题的办法:java中提供了一个同步机制(锁)。即让操作共享数据的代码在某一时间段,只被一个线程执行(锁住),在执行过程中,其他线程不可以参与进来,这样共享数据就能同步了。简单来说,就是给代码加把锁。Java同步机制的实现方式:同步代码块同步方法(函数)同步代码块锁从哪儿来?Java中的每个对象都内置了一个锁(监视器monitor),当某个线程执行到同步代码块时就会自动得到这个对象的锁,那么其他线程就无法执行同步代码块了,一直要等到
14、之前那个线程停止(释放锁)。语法格式:synchronized(对象) /可以使用任意对象的锁,包括this操作共享数据的代码即需要同步的代码;/使用当前售票窗口对象的锁来锁住卖票的代码synchronized(this) /当前售票窗口/卖票的代码/使用任意对象的锁来锁住卖票的代码Object obj=new Object();synchronized(obj) /当前售票窗口/卖票的代码同步方法(函数)代码块是用于封装代码的,而我们之前学习的方法(函数)也是可以封装代码的,刚才我们同步了一个代码块,那么能否同步一个方法(函数)呢?课堂案例:卖火车票改为同步方法实现一个类中既可以有同步方法也
15、可以有普通方法语法格式:public synchronized void sell() /锁是固定的this,即当前对象操作共享数据的代码即需要同步的代码;同步机制的优劣同步的好处: 同步的出现解决了多线程的安全问题。同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。(性能和线程安全不可兼得)同步静态方法(了解即可)静态方法(函数)也可以同步,用法和普通方法一样,只是需要注意:静态方法的锁肯定不是this,为什么?静态方法随着类的加载而加载,这时有可能还没有该类的对象,但是一个类加载进内存,会先将这个类的字节码文件封装成对象,该对象的表示方式:类名.class,这是静态方法的锁。小结同步方法(函数)和同步代码块的区别:1. 语法不同2. 同步代码块使用的锁可以是任意对象3. 同步方法(函数)使用的锁是固定对象this注意细节:必须有共享资源必须使用同一把锁只把必
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版小学四年级上册数学口算练习试题 全套
- 金属热处理考试题(含参考答案)
- 石油产品购销合同范本
- 电路理论模拟考试题(含参考答案)
- 网络安全服务合同
- 生猪养殖合同生猪采购合同
- 人力资源部门劳动合同协议
- 面料订购合同模板
- 原料供应居间合同
- 胃造瘘管病人护理查房
- 汽车吊起重吊装方案
- 从0到1开播指导抖音本地生活商家直播培训
- 产房助产士进修汇报
- 大型综合楼新建工程技术方案、施工方案投标文件(投标方案)
- GB/T 16439-2024交流伺服系统通用技术规范
- 2024义务教育《英语课程标准》(2022版)
- 闽教版小学英语四年级 (下)Unit 6 Weather Part A 教学设计
- 铁粉销售合同
- 初中语文修改病句市公开课一等奖省赛课获奖课件
- 世界《结核病日》主题班会课件
- 高考数学微专题集专题6圆锥曲线硬解定理微点1圆锥曲线硬解定理(原卷版+解析)
评论
0/150
提交评论