`
宁远天意
  • 浏览: 5557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_多线程

阅读更多
----------- android培训java培训、java学习型技术博客、期待与您交流! ---------


多线程:
概念:应用程序有多条执行路线。
进程:当前正在运行的应用程序。
线程:进程的执行单元。或者说,它就是一条执行路线。
怎么用多线程呢? 或者说,多线程的实现方式是怎么样的?
java是不能直接调用操作系统属性的,但是可以通过调用其他语言来间接的调用操作系统的功能。
Thread类:
同一个线程对象,调用两次start()方法,程序会抛异常。
IllegalThreadStateException:线程状态不正常。
如何获取线程的名字以及重命名?
获取:public final String getName();  获取当前线程的名字。名字的格式:Thread+编号(从0开始的。)
重命名:public final void setName(String name);
什么时候使用多线程?
为了提高效率的时候。
当我们要操作的代码的内容比较多(耗时),循环的次数比较多的时候。就可以考虑使用多线程。
理解多线程的一个误区?
每一个线程都会消耗内存资源,并不是线程越多越好。
线程执行的随机性是怎么回事?
程序的执行,其实就是在抢占CPU资源,CPU是在各个程序之间做高效的切换。
(线程执行的随机性是因为CPU的切换)

第一种实现方式:
1、自定义一个类来继承Thread类。
2、子类重写Thread类中的run()方法。
3、让线程启动并执行。
线程启动不能直接调用run()方法,要调用strat()。
而start()这个方法做了两件事:
1、让线程启动。
2、自动调用run()方法。
采用第1种创建线程的方式创建3个线程,分别设置线程名字为 : 曹操,刘备,孙权. 然后调用start()方法运行.

第二种实现方式:
1、自定义一个类MyRunnable去实现Runnable接口。
2、重写run()方法。
3、创建该类MyRunnable的实例。
4、把类MyRunnable的实例做为Thread类的构造参数传递,创建Thread对象。
注意事项:
因为我们的自定义的类MyRunnable只实现了Runnable接口,并没有直接继承Thread类。所以Thread类里边的方法,他是不能直接用。
public static Thread currentThread();
既然已经有了继承Thread类的实现方式,为什么还要提供实现Runnable接口呢?
A:避免了单继承的局限性。
B: 实现接口Runnable的方式,创建了一个资源对象,节省资源。实现了数据和操作的分类。(掌握)
需求:线程的第2种方式实现线程,并给两个线程分别设置名字为 天成,八戒,然后运行两个线程。

用多线程模拟窗口卖票。
第一种方式:自定义一个类,继承Thread类。
第二种方式:自定义一个类,来实现Runnable接口。

为什么我们在用多线程模拟窗口卖票的时候,会出现重复数值以及负数呢?
因为线程执行的随机性和延迟性,导致线程访问共享数据的时候出了问题。
public static void sleep(long millis);   让线程睡一会,睡多长时间呢?看给定的毫秒值。
为什么会出现负数?
//如果此时,四个线程对象都抢到了CPU资源,会出现:
/**
* 此时tickets的值为1
* t1:第1张票,  tickets值为0
* t2:第0张票,  tickets值为-1
* t3:第-1张票,  tickets值为-2
* t4:第-2张票,  tickets值为-3
*/
为什么会出现重复值?
关键点:tickets--
他其实做了三件事:
A:读取tickets变量的值。
B:修改tickets变量的值。
C:把修改后的值赋值给tickets变量。
如果当线程t1执行完A步骤,还没有来得及执行B的时候,
如果线程t2抢到了CPU资源,这个时候就会出现重复值的情况。

怎么解决呢?
在有可能会出问题的代码上加一个锁。

怎么判断多线程有可能出问题的代码?
1、是否有共享数据。
2、是否有多条语句操作共享数据。
3、是否是在多线程环境中。
怎么加锁。(同步机制,同步代码块,加锁)
synchronized(锁对象)
{
有可能出现问题的代码。
}
锁对象:因为我们不知道是什么类型的,所以这里给了一个Object。
两个状态:开,关。
注意:多线程加锁必须是同一把锁。

同步代码块的锁对象是什么类型?
可以是任意类型。
同步方法:在方法上加锁。
格式:推荐在方法的返回值的数据类型前加synchronized。
举例: public synchronized void show(){}
同步方法的锁对象是谁呢?
就是this对象。
静态方法的锁对象是谁呢?
就是该类的字节码文件对象。
类名.class
既然有同步代码块了,又有同步方法,我们使用谁呢?
同步的代码越少越好。所以,一般我们都来是用同步代码块。
但是,有些时候,一个方法里边的代码都需要被加锁,那我们就可以考虑使用同步方法。
面试题:
写一个死锁的代码。

用学生类模拟线程间通信问题。
线程间通信:就是指不同线程间对共享数据进行操作。
我们用学生类来模拟的时候,需要创建哪些类呢?
学生类:Student
对学生赋值的类: SetStudent
获取学生信息的类:GetStudent
测试类:Test
刚才,我们在测试的时候,发现一个问题,打印的数据,姓名和年龄不匹配?
怎么产生?
原因是因为线程的随机性。
怎么解决?
给所有的操作都加锁,注意,一定要给同一个锁对象,这个时候,我们的问题就解决了。
但是有有又一个新的问题?
我们发现数据是成片输出的,原因就是当线程对象抢到CPU资源的那一刻,足够它做好多事情了。
新的需求:
让刘意,林青霞,依次输出。
用等待唤醒机制来处理。
在处理之前,我们先说一个小问题:之前我们写的程序,是无限的在赋值和取值。
正常的逻辑:
针对输出:如果有数据,我们就输出。如果没有,就等待设置数据。
(比如说,咱们去买票,如果有,我们就直接买了,如果没有,就等着出票)
针对设置:如果有数据,就等待输出,如果没有,就设置。
(比如说:火车站售票,有人来买,如果没票,我就造票)
唤醒机制:
Object类中的两个方法:
public void wait();   让线程处于等待状态。
public void notify(); 唤醒正在等待的线程。
面试题:
wait()和sleep()的区别?
wait():是Object类中的方法,是不需要传递参数的,会释放资源,然后让出CPU资源。
sleep():是Thread类中的静态方法,是需要传递参数的。不会释放资源。

1、模拟卖票,用同步代码块处理一下。
2、用唤醒机制模拟写一下,用学生类模拟线程间的通信。

线程的优先级:
public final int getPriority();  获取线程的优先级。
public final void setPriority(int test);  更改线程的优先级。
注意:
1、线程的优先级默认是5,范围是1-10.
2、线程的优先级越高,并不代表者线程一定第一个执行。
而是说,线程的优先级越高,能在一定的基础上,让该线程获取到更多的执行权。
线程的拓展知识:
暂停线程:
public static void yield();   暂停当前正在运行的线程,并执行其他线程。
注意事项:
一定程度上,可以让线程运行的更和谐一点,防止出现成片的同一线程的数据。
但是,他不能保证实现数据依次出现,所以,如果需要依次输出数据,还是要
采用等待唤醒机制。
加入线程:
public final void join();  等待线程终止。
注意事项:
当在加入一个线程之前,该线程必须先启动。
效果:
一旦有join线程加入,其他线程必须等待,等该线程执行完毕,其他线程才开始执行。
用法:
当一个线程需要在某个线程执行完之后再执行,就可以用该方法。
守护线程:
main函数本身也是一个线程。
main函数是程序的主入口。
public final void setDaemon(boolean on);  设置线程为守护线程。一旦前台(主线程)线程结束,守护线程跟着都全部结束。






----------- android培训java培训、java学习型技术博客、期待与您交流! ---------
分享到:
评论

相关推荐

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料

    黑马程序员_张孝祥_Java多线程与并发库

    黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.

    多线程高新(黑马程序员)

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1470696

    黑马程序员-java多线程技术01

    NULL 博文链接:https://huangminwen.iteye.com/blog/1157983

    java并发库高级应用源码--张孝祥

    java并发库thread使用,传统线程技术、定时器技术、线程互斥技术,同步通讯技术、多线程共享数据、并发库应用,线程锁技术,阻塞锁、阻塞队列,线程池等应用

    黑马程序员–Java多线程讲解笔记

    当一个进程中线程有多个时,是多线程。  为什么要用多线程  1,让计算机"同时"做多件事情,节约时间。  2,后台运行程序,提高程序的运行效率.。  3,多线程可以让程序"同时"处理多个事情。  4,...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    传智播客_Java培训_毕向东_Java基础[05-多线程]

    传智播客_Java培训_毕向东_Java基础[05-多线程]系黑马程序员_毕向东_Java基础视频教程

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画之移动动画 |--动画之组合动画 |--动画之缩放动画ScaleAnimation |--反序列化对象 |--发送短信 读天气 调音量...

    java拼图游戏源码.zip

    这是一个java写的拼图游戏,用了swing、多线程等知识,可以设置行数列、列数、还有使用多线程写的游戏动画,拼图的图块具有磁贴设计,代码封装性较强,容易移植,纯原创。

    图解java多线程设计模式

    日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与多线程和并发处理相关的12种设计模式。每章附带练习题和答案,...

    图解java多线程设计模式2017年8月最新版

    精选12种与多线程和并发处理相关的设计模式 264张图表 + 300段Java示例程序 = 轻松学习多线程编程 日本经典多线程入门书,原版长销11年! 本书适合以下读者阅读 a.对多线程感兴趣的人 b.对Java编程感兴趣的人 c.对...

    8天快速掌握Android系列视频之04_开发与 运行(卸载)第一个ANDROID应用

    黑马程序员_8天快速掌握Android视频 总共67个视频教程,包括:02_搭建Android开发环境,03_创建与启动手机模拟器和学习使用ANDROID操作系统,04_开发与 运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及...

    8天快速掌握Android系列视频之07_查看应用输出的错误信息 与如何部署应用到真实手机

    黑马程序员_8天快速掌握Android视频 总共67个视频教程,包括:02_搭建Android开发环境,03_创建与启动手机模拟器和学习使用ANDROID操作系统,04_开发与 运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及...

    拼图游戏 (源码+所有文件)

    萌新做的一个简单的Java拼图游戏 启动类:pers.sept.jigsaw1.swing下的...多线程。 下拉列表选择数字可以切换关卡图片,最后的“+”,可以添自己的图片到关卡中。 设有背景音乐 有一键通过按钮 等等,块下载去看看吧。

    图解java多线程设计模式 2017年8月最新版

    这本书的pdf文件有162M,是最新版高清的pdf,网上原书售价60多元,这里提供的附件是百度云的链接地址。

    《Java基础案例教程(第2版)》课后习题答案1

    第1章 Java开发入门一.填空题1. 面向对象,SUN 2. JavaSE,JavaEE,JavaME3.面向对象、跨平台性、支持多线程4. JDK5.bin

    JAVA核心知识点整理.pdf

    给大家分享一篇我在学习java过程中...包含常见的面试题:JVM、Java集合、多线程并发、java基础、SSM框架原理、微服务、Netty和RPC、网络、日志、算法、数据结构、加密、分布式算法、机器学习、大数据等知识点,都是干货

    mfc教程(word版)

    4.4.3.2 命令消息的派发和消息的多次处理 67 4.4.3.3 一些消息处理类的OnCmdMsg的实现 69 4.4.3.4 一些消息处理类的OnCommand的实现 71 4.4.4 对控制通知消息的接收和处理 72 4.4.4.1 WM_COMMAND控制通知消息的处理 ...

    黑马JVM学习笔记二

    title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 ...线程是私有的,多线程之间分别有各自的程序计数器记录对应线程的执行位置 程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢

Global site tag (gtag.js) - Google Analytics