------- 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多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...
8. **多线程**:介绍线程的概念,讲解如何创建和控制线程,以及同步机制,如synchronized关键字和wait/notify机制。 9. **Java API和类库**:通过实例演示如何使用Java标准库中的各种类,如Date、Calendar、Math等...
【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...
《黑马程序员_从零开始征服Android之旅(第一季)源码和笔记》是一份全面的Android开发学习资源,旨在帮助初学者系统地掌握Android开发技术,实现从理论到实践的跨越。这份资料涵盖了一系列关键知识点,包括但不限于...
9. **多线程**:讲解如何创建和管理线程,以及同步机制。 10. **反射**:讨论如何在运行时动态获取类信息并进行操作。 【Java视频教程】 视频教程是学习Java的有效方式,它能直观地展示编程过程,便于理解复杂的...
这个名为“黑马程序员_毕向东_Java基础源码.rar”的压缩包文件,包含了丰富的Java基础源代码实例,对于初学者来说,是深入了解Java编程的良好资源。 一、Java基本语法 Java语言以其严格的类型检查和面向对象特性...
在本课程中,“黑马程序员”将引导我们快速入门安卓应用程序的开发,这是一段为期两天的密集学习旅程,第01天的课程主要侧重于基础知识的建立和首个安卓程序的编写。通过这次学习,我们将了解到安卓开发环境的搭建、...
本文将深入探讨“多线程高新”这一主题,结合黑马程序员的课程内容,来阐述多线程的核心概念、优势、实现方式以及在实际应用中的注意事项。 首先,多线程是指在一个进程中同时执行多个线程,这些线程可以共享同一...
根据提供的文件信息,我们可以推断出这是一套由知名IT教育机构“黑马程序员”出品、由讲师毕向东主讲的Java基础教学视频。由于实际视频内容无法直接获取,本篇将依据标题、描述以及部分标签内容,综合分析并展开相关...
在"黑马程序员_Java基础辅导班教程课件[第01期]第10天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java的核心概念。通过这个阶段的学习,学员将能够理解并运用Java的...
在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...
本教程将聚焦于Java中的多线程技术,以“黑马程序员-java多线程技术01”为学习起点,探讨如何在Java中实现并管理线程。 首先,我们来理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个...
在B站黑马程序员的Python教程中,你将深入理解Python的基础概念,包括: 1. **变量与数据类型**:Python支持多种数据类型,如整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。此外,还有列表(list...
Java多线程是Java编程中不可或缺的部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文主要探讨了多线程的概念、应用场景...因此,理解和掌握Java的多线程技术对于任何Java程序员来说都是至关重要的。
Java并发库是Java编程中非常重要的一个领域,它为开发者提供了高效、安全的多线程编程工具。在《java并发库高级应用源码--张孝祥》中,我们将会深入探讨Java中的线程管理和并发控制策略,这对于我们理解和优化多线程...
Qt提供了多线程编程的支持,包括线程的基本概念介绍、多线程的使用方法和线程安全绘图等。在数据库操作方面,Qt也提供了强大的支持,包括数据库操作的基本概念、使用模型操作数据库和对数据库数据的可视化显示等。 ...
黑马程序员作为知名的IT教育机构,其2018年的Python爬虫课程旨在教授学员如何有效地抓取和处理网络上的信息。在这个完整的课程中,你将深入理解Python爬虫的基本原理,并学习到一系列实用的技巧。 首先,Python之...
4. **多线程应用** - **游戏主线程**:负责游戏的主循环和逻辑处理。 - **GUI刷新线程**:为了保持流畅的游戏体验,GUI通常在独立的线程中刷新,避免因为更新界面导致游戏暂停。 5. **优化技巧** - **缓冲区策略...