黑马程序员日记13----多线程
来源:互联网 发布:windows错误恢复 编辑:程序博客网 时间:2024/05/17 08:19
---------------------android培训、java培训、期待与您交流! ----------------------
1:多线程
(1)多线程
进程:正在进行中的程序。其实进程就是一个应用程序运行时的内存分配空间。
线程:其实就是进程中一个程序执行控制单元,一条执行路径。进程负责的是应用程序的空间的标示。线程负责的是应用程序的执行顺序。
一个进程至少有一个线程在运行,当一个进程中出现多个线程时,就称这个应用程序是多线程应用程序,每个线程在栈区中都有自己的执行空间,自己的方法区、自己的变量。
(2)jvm启动是多线程的吗?
jvm在启动的时,首先有一个主线程,负责程序的执行,调用的是main函数。主线程执行的代码都在main方法中。
当产生垃圾时,收垃圾的动作,是不需要主线程来完成,因为这样,会出现主线程中的代码执行会停止,会去运行垃圾回收器代码,效率较低,所以由单独一个线程来负责垃圾回收。
(3)如果实现多线程呢?
A:继承Thread类
步骤:
**定义一个类,继承Thread类
**重写run方法
**调用start方法.
**启动线程
**调用run方法
Thread类中的常用方法:
**Thread(String name):通过构造给线程起名字
**setName(String name):通过set方法给线程起名字
**getName():获取线程的名称
**currentThread():获取当前线程的一个对象引用
***获取哪些没有直接继续Thread类的线程名称
B:实现Runnable接口
步骤:
**定义一个类,实现Runnable接口
**重写run方法
**创建实现了Runnable接口的子类对象,并把该对象作为参数传递给
Thread类的对象.这个时候,调用Thread类的start方法.
(4)线程的生命周期
A:创建
B:就绪
C:运行
D:阻塞 sleep,wait导致阻塞
sleep的时间到了,wait的被唤醒了.就到了就绪状态
E:死亡
(5)卖票的问题
A:继承Thread实现卖票
这个时候,我们的票需要定义为静态的.但是呢,我们不建议这样做.
B:实现Runnable接口卖票
在这里,我们就发现卖票除了问题.(线程安全问题)
线程安全问题怎么产生的?
**多个线程延迟访问
**线程的随机性
(6)解决线程安全问题
A:同步代码块
格式: synchronized(对象)
{
//被同步的代码,也就是可能出现安全问题的代码
}
B:同步方法
就是在方法上加synchronized关键字即可.
C:同步的前提:
**同步需要两个或者两个以上的线程
**多个线程使用的是同一个锁。
未满足这两个条件,不能称其为同步。
D:同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,
无形中会降低程序的运行效率。
同步可能造成死锁问题:
死锁的产生:
你拿着我们的锁,我拿着你的锁,谁都不先对方用.
举例:吃饭,西餐(刀和叉)
A:有两个刀
B:有两个叉
针对程序来说,就是我想用你的锁,而你也想用我的锁.都不放手.导致了死锁.
用代码实现一下死锁.
解决死锁的方式:不写这样的代码就可以.
单例的安全问题:
class Student
{
private Student(){}
private static Student s = null;
public static Student getInstance()
{
if(s==null) //t1,t2,t3,t4
{
//如果进来了就创建了多个对象.不满足单例的要求.
s = new Student();
}
return s;
}
}
}
---------------------android培训、java培训、期待与您交流! ----------------------
- 黑马程序员日记13----多线程
- 黑马程序员学习日记--多线程
- 黑马程序员_日记13_Java多线程(三)
- 黑马程序员日记-13
- 【黑马程序员】多线程学习日记1
- 黑马程序员学习日记----多线程(一)
- 黑马程序员学习日记----多线程(二)
- 黑马程序员学习日记(1)--初学多线程
- 黑马程序员_日记01(多线程)
- 黑马程序员-----java多线程(学习日记)
- 黑马程序员--日记一--IOS多线程学习
- 黑马程序员--多线程学习日记
- 黑马程序员_学习日记7_多线程、套接字
- 黑马程序员_学习日记三_多线程一
- 黑马程序员_学习日记四_多线程二
- 黑马程序员--Java学习日记6_多线程
- 黑马程序员_Java学习日记6_多线程
- 黑马程序员_ JAVA学习日记—JAVA中的多线程
- 黑马程序员日记12-----泛型
- A simple poem
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- Vim快速选中、删除、复制引号或括号中的内容
- 关于List<object>中按对象的某个属性值排序的方法
- 黑马程序员日记13----多线程
- shell编程基础
- 非负矩阵分解:数学的奇妙力量
- asp.net 中chartlet 统计图表的的使用
- 异步加载数据的三种实现
- SQL SERVER 2008 “阻止保存要求重新创建表的更改” 解决方法
- vb.net 预生成事件获取SVN版本号,编译日期,版本日期
- 常用的Java开源软件
- XCode的一些调试技巧