`
IT_nice
  • 浏览: 7860 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_多线程

阅读更多

------- android培训java培训、期待与您交流! ----------

 

 

1.进程

正在执行的程序, 在内存中占用空间. 

2. 线程

进程的具体的执行路径(线索),一个进程中至少会有一个线程.当然一个进程中可以存在多个线程.  

3. 多线程

存在的意义,可以提高cpu 资源的利用率. 避免cpu 的闲置. 

多线程,不会让程序变的更快,很有可能由于多个线程之前的切换,导致变慢的(线程之间切换时,需要消耗资源的)

4.java多线程. 

jvm支持多线程.

java是完全面向对象的语言,提供了专业的类表示线程.-> Thread类. 

java 创建线程的方式: 

java 中创建线程的方式有二种. 

方式一: 使用继承方式. 

1.定义类继承Thread 类 

2.重写run方法, 该方法中定义需要线程执行的任务(代码)

3.创建该类对象-> 线程创建出来了. 

4.调用start(继承父类)的方法,启动线程... 

线程执行, 抢占cpu 的执行权, 抢到了就执行run方法中的代码... 

方式二:  使用实现. 接口方式. 

1. 实现类实现Runnable 接口. 

2. 重写接口中的run 方法. 

3. 创建实现类对象. 

4. 创建Thread 类对象,并通过构造函数接收Runnable接口的实现类对象. 

5. Thread 对象调用start 方法. 

推荐使用方式二:

1.语法保留继承. 

java 只支持单继承,如果使用继承方式,创建线程,无法继承其他类. 

如果使用实现的方式,还可以保留一个继承... 还可以继承其他类... 

2.使用接口方式,更加符合面向对象的思想. 

|---接口的实现类对象, 定义线程需要执行的任务... 

|---单独的创建Thread 对象, 创建了线程. 

将任务和线程分离了.. 既可以一个线程执行一个任务, 也可以多个线程执行同一个任务. 

面向对象: 万物皆对象... 

5. 多线程的安全问题. 

什么情况下会出现线程安全问题. 

1. 充分条件, 多个线程... 

2. 必要条件, 多个线程修改了共享的数据, 如果知识获取共享数据,不会出现问题...

6.解决多线程的安全问题. 

例如: 银行账户, 有卡, 有折. 

两个人同时取钱, 一个去ATM ,一个去柜台, 相当于并发了程序, 多线程的程序. 两个线程同时执行... 

两个线程要修改共享的数据, 导致线程的安全问题. 

解决安全问题

使用同步代码块. 

synchronized(对象){

需要同步的代码; 

}

对象可以是任意类型的. 只需要对象要保证唯一性. 

多个线程持有的对象,同一个,才能解决多线程的安全问题.  

7.线程的常见方法. 

1. 构造函数

Thread(String name);

初始化线程名

getName();

获取线程名

setName();

设置线程名

getId();

获取线程的id 

setPriority

设置线程优先级. 

windows 范围是1~10 默认是5. 

getPriority

获取线程优先级. 

run

提供给子类重写使用的. 

子类可以在改方法中定义需要线程执行的任务. 

启动线程后,线程自动的地调用run方法. 

如果创建一个线程对象之后,不调用start ,直接调用run方法, 不会真正的开启一个线程,仅仅执行普通的run 方法. 

start

开启线程的. 

只有Thread 类才具备start 方法, 只有Thread 对象才能表示线程才能开启线程. 

注意: 一旦使用start 方法之后,不能再次调用. 一个线程对象不能开启2次... 

一个java 程序启动后,至少会有2个以上的线程... 

主线程. 垃圾回收机制(后台线程)

sleep(毫秒);

程序睡眠, 线程释放了cpu  cpu 执行其他的线程了... 

注意:  如果多线程的,有一个线程持有了同步的锁对象, 并且遇到了sleep ,即时该线程释放了cpu, 不释放锁对象. 其他线程获取cpu,也无法进入同步代码块中执行... 

currentThread()

静态方法. 

获取当前线程对象. 

stop(); 

过时的, 结束线程. 

所谓的过时的方法,不再建议使用... 

可以通过布尔标记控制线程... 

8. 同步方法. 

非静态同步方法:

修饰符  synchronized 返回值类型  函数名(){

 

如果同步方法是非静态的,该方法默认的锁对象就是this. 

注意: 同步方法使用的锁对象是this, 不一定能够保证对象的唯一性... 尤其通过继承方式创建的多线程下... 

静态同步方法:

修饰符  synchronized static 返回值类型  函数名(){

 

静态同步方法默认锁对象是该类的字节码对象. 类名.class. 

单例设计模式?

饿汉

懒汉

懒汉式,在多线程下出现安全问题, 在多线程无法保证单例对象的唯一性... 

使用了双重判断. 

StringBuilder

1.5  不同步. ->效率高. 注意,如果是多线程. 应该使用StringBuffer;  

StringBuffer

1.0  同步 -> 效率低.  在单线程下不需要同步的. 

9.死锁. 

多线程下. 多个锁. 

线程T1,线程T2, 锁对象C1, 锁对象C2. 

程序执行 T1持有C2,想要获取C1, 

      T2持有的是C1,想要C2. 

哲学家就餐问题:

写一个死锁程序

10. 线程通信

wait 

notify 

11.线程的生命周期.

新状态

可运行

运行

阻塞

死亡. 

12.后台线程. 

软件升级.

普通软件:

后台线程,检测是否更新,如果有更新,弹窗,提示是否更新...  

当你的软件运行的时间较短,,, 更新程序没来得及获取到最新的状态. 程序就结束了... 如果是后台线程,直接停止了... 

后台线程:

普通的非后台线程最大的区别,  如果一个程序的所有的非后台线程执行完毕了, 该程序即使该后后台线程没有执行完毕,后台线程要结束了

13.特殊的方法. 

join.  等待该线程结束. 

 

例子:

   package cn.itcast.c_thread2;

 

public class DataMoveDemo1 {

public static void main(String[] args) {

Person p = new Person();

Input in = new Input(p);

Output out = new Output(p);

 

Thread t1 = new Thread(in);

Thread t2 = new Thread(out);

 

t1.start();

t2.start();

 

}

}

 

class Person {

private String name;

private String gender;

 

private boolean flag = true;

 

/**

* 从mySql读取了数据,使用对象存储数据.

*/

public synchronized void set(String name, String gender) {

if (flag) {

this.name = name;

this.gender = gender;

flag = false;

 

// 唤醒对方线程 

notify(); 

// 释放cpu 执行权... 同时释放锁.

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

 

public synchronized void get() {

if (!flag) {

System.out.println(this.name + "---------" + this.gender);

flag = true;

 

// 线程等待之前,唤醒对方线程... 让对方线程执行. 

notify(); 

// 释放cpu 释放锁.

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

 

}

}

}

 

/**

 * 读取mySql 获取数据. 并使用对象存储数据.

 * */

class Input implements Runnable {

Person p;

 

int i;

 

Input(Person p) {

this.p = p;

}

 

@Override

public void run() {

while (true) {

 

if (i % 2 == 0) {

p.set("jack", "male");

} else {

p.set("小丽", "女");

}

i++;

 

}

}

}

 

class Output implements Runnable { // ctrl+1

Person p;

 

public Output(Person p) {

this.p = p;

}

 

@Override

public void run() {

while (true) {

p.get();

}

}

 

}

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    黑马程序员_张孝祥_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