黑马程序员-day10-多线程上部分
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
进程 | 正在进行中的程序 | 每一个进程都有执行顺序,该顺序是一个执行路径,或者叫控制单元 |
线程 | 进程中的一个独立的控制单元,进程至少有一个线程 | 线程控制着进程的执行 |
多线程 | 一个进程中包含不止一个线程 |
比如玩英雄联盟,这是一个进程。其中包括打野线程和观察线上战况的线程。一边打野,一边观察线上的战况,此时大脑就是CPU,在打野和观察上频繁切换。 多线程一般用于执行循环结构; |
jvm | 进程java.exe | 该进程中至少有一个主线程,并且该线程运行的代码存放在主函数中 |
Thread类 | 线程类 | 调用电脑系统方法创建线程 |
方法:run | 新线程所要执行的代码,用来给子类复写 | |
方法:getName | 获取线程名称 | |
方法:static Thread currentThread | 返回当前线程(对象),静态的可直接类名调用 | |
创建新线程方式1 | 第一步,创建类继承Thread | 注意Thread的类中的方法和构造函数 |
第二步,类的构造方法,调取父类方法(可以自定义线程名称) | 自定义线程名称,有默认的Thread-0、Thread-1… | |
第三步,复写Thread的run方法 | run方法中,写入需要新线程执行的代码 | |
创建该类的对象 | 创建新线程 | |
对象名.start(); |
执行新线程中的run方法 如果直接使用对象名.run();那么执行该方法的就不是新线程 |
|
创建新线程方式2 | 第一步,创建一个实现Runnable接口的类 | 如:class Demo extends Runnable |
第二步,类中复写Runnable中的抽象方法 |
public void run() Runnable中只有一个方法 |
|
第三步,新建一个该类对象 | 如:Demo d=new Demo() | |
第四步,新建一个线程类对象,将该类对象作为参数传给线程类的构造函数 | 如:Thread t=new Thread(d,name) | |
启动线程,调用run方法 | 如:t.start(); | |
可用匿名内部类来写 |
Thread t=newThread(newRunnable() { privateint cola=50; publicvoid run() { //复写run方法的代码 } },"线程1"); |
|
方式2优点1: | 避免了java单继承的局限性,在实现Runnable的同时还可以继承其他类, | |
方式2优点2: | 避免了创建静态变量,在继承方式中,由于线程对象不同,要使多个线程共享一个变量,就需要将该变量设置为static。但是在方式2中,由于是将实现Runnable类的同一个对象以参数形式传递给Thread的构造函数,因此不需要设置静态变量 | |
多线程特性 | 随机性 | 多线程执行次序具有随机性,哪个线程抢到CPU执行权,谁执行,CPU在做着频繁切换,看起来似乎同时运行 |
多线程安全性 | 产生原因:多线程的随机性 | 当多个线程执行同一个方法,并且多个线程均使用到了该方法体中的共享数据时,如果此时方法体中不止一句代码,那么就有可能出现安全问题。比如if语句对共享数据判断,线程A判断满足后,执行权被B抢走,此时线程B判断时,仍然是满足。但是其实A如果正常执行完if语句中的代码,B再判断已经不满足了。此时就出现了安全问题 |
sleep方法 | 属于Thread类 | public static sleep(long millis)throws InterruptedException |
同步 | 前提 | 存在安全问题;操作共享数据的多个线程使用同一个锁 |
弊端 | 消耗资源 | |
同步代码块 synchronized(任意非匿名对象) |
哪些代码需要同步,看哪些代码操作了共享数据,再将这些代码写入同步代码块中 如果锁是匿名对象,当锁住后,匿名对象就变成垃圾了,那么每次进来,都是产生一个新的匿名对象,根本无法锁住(比如房间的锁,假设锁上后锁就自动消失了,这样的锁当然没用处了) |
|
同步函数,在函数上加上synchronized修饰 | 函数内必须是全部操作共享数据的代码,如果还有其他代码,那么需要将需要同步的代码抽离出来,定义为另一个同步函数,再在该函数相应的地方,调用同步函数即可 | |
找到需要同步的代码 |
1,找到多线程运行的代码。 2,明确这些代码的共享数据有哪些 3,明确多线程的代码中,有哪些是操作了共享数据的 |
|
synchronized(锁) |
锁一般情况下是一个对象; 同步代码块的锁可是是任意一个非匿名对象; 同步函数的锁是本类对象,即this; 静态同步函数的锁是本类的class文件,即类名.class |
|
死锁 | 同步嵌套并且使用的不是同一个锁 | 线程1拿到锁A,想要进锁B的时候,线程2刚好拿到锁B,想要进到锁A,导致程序卡死 |
需尽量避免死锁 | 面试时可能会考死锁 |
黑马程序员-day10-多线程上部分相关推荐
- 黑马程序员_Java_多线程
线程的理解 1.同一个应用中,多个任务同时进行.就像editplus编辑工具,打开一个文件窗口就是一个线程. 2.线程可以有多个,但cpu每时每刻只做一件事(多核除外).由于cpu处理速度很快,我们就 ...
- 黑马程序员—C#多线程
----------------------Windows Phone 7手机开发..Net培训.期待与您交流! ---------------------- 通过几天的学习,对多线程有了初步的了解, ...
- 黑马程序员5 多线程
------- android培训.java培训.期待与您交流! ---------- 创建线程的第一种方式:继承Thread类. 步骤: 1,定义类继承Thread. 2,复写Thread类中的ru ...
- 黑马程序员——Java 多线程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java 多线程 1.多线程概述 多线程概述 进程: 正在运行的程序,是系统进行资源分配和调用的 ...
- [置顶] 黑马程序员 -- 多线程
黑马程序员 -- 多线程 polk601001 星期五, 15/06/2012 - 17:14 发布 什么是多线程? 多线程就是使程序并发(同时)执行几个操作. .NET 框架类库在System.Th ...
- 黑马程序员_java高级篇网络编程TCP实战Day8(上)
---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...
- 黑马程序员—总结过去的一年!站在学生时代的尾巴上!
文章来源:黑马程序员,黑马论坛 Enjoy life,Enjoy coding,Avoid the chance to regret forever! ...
- Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)
Visual Studio 2022版本 B站黑马程序员C++自学分享-第一阶段(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 一.第一阶段 C++基础语法入门 对C++有初步了解 ...
- Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码、通过注释来备注上自己对代码的理解)
Visual Studio 2022版本 B站黑马程序员C++自学分享-第三阶段(1)(主要包括:自己敲的代码.通过注释来备注上自己对代码的理解) 前言 三.第三阶段 C++提高编程 介绍C++泛型编 ...
最新文章
- UML作业第一次:UML用例图绘制
- 计算机网络第二章-物理层
- 浅谈如何防范电池事故
- find a group of people who want to do similar things with you
- 浅析GitLab Flow的十一个规则
- 微信小程序源码1000套
- 对集成电路的认识以及集成电路的重要性
- 软考和华为证书的含金量,哪个更适合找工作
- 职业规划(一)怎么写简历
- GCC编译器下C语言不定长参数宏##__VA_ARGS__和__VA_ARGS__的使用
- JS逆向 2021-8-16 网易云音乐 params、encSecKey参数
- java打印日志的几种方式
- 几种常见的提取关键词的算法(4)
- 乐高大颗粒作品15:移动篮球框
- java并发编程学习三——wait/notify与park/unpark
- 魔改Win11 系统焕然一新,颜值和性能飙升
- 移动二维码支付 推进二维码扫码智能POS
- Rust+物联网智能报警方案、Rust腐蚀智能电路教程
- 羧基/羟基/氨基/巯基/环氧基/磺酸/胺基/苯基官能团化二氧化硅微球制备研究过程
- java字符串相加_String字符串相加的原理