黑马程序员_多线程1
2013-09-24 21:49
162 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1. 多线程
|-- 什么是进程:正在运行的程序,占有的内存中的区域
|-- 线程:其实就是执行代码的独立控制单元,CPU执行代码的路径
2. java中对多线程的支持
|-- 线程也封装成对象,描述线程对象的类,java.lang.Thread类
|-- 创建线程的第一种方式:
|-- 将类,声明为Thread子类,继承Thread
|-- 重写Thread类的run方法
|-- 重写run方法原因:java工程师不知道以后的开发者会用线程运行哪些代码,规定了一个规范:
凡是写在run方法中的,代码,都是被线程执行的代码
|-- 建立Thread的子类对象
|--调用子类对象的start()方法
|-- 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
3. 多线程的随机性
|-- 我们程序中的线程,在被CPU执行,CPU先执行谁,执行时间,看CPU的心情
|-- 就是一个随机的,没有规律的结果
|-- JVM是单线程还是多线程程序?多线程,一条线程执行我们写的代码,一条收垃圾呢
4. 线程的状体图 *****
5. 设置和获取线程名
|-- 获取线程名字:public final String getName()默认 Thread-0
|-- 在不是Thread子类中,获取线程名称,在Thread类中提供了一个静态方法 currentThread(),
方法的运行结果,是当前正在执行的线程对象 public static Thread currentThread();
Thread.currentThread().getName();
|-- 设置线程名
|-- public final void setName(String name)
|-- new Thread(String name)
6. 使用多线程技术,模拟售票,一节车厢100张,多窗卖票
//定义类,票,模拟售票
class Ticket extends Thread{
private static int tickets = 100;
public void run(){
while(true){
if(tickets>0){
try{
Thread.sleep(5);
}catch(Exception e){}
System.out.println(getName()+"..出售第"+tickets--+"张票");
}
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
===========================================================================================================================================
7. 创建线程的方式二 步骤 重要
|-- 定义类实现Runnable接口
|-- 重写run方法
|-- 建立Thread对象,在构造方法中,传递Runnable接口的实现类对象
Thread(Runnable target)
|-- 调用Thread对象中的start方法,启动线程
8. 两种线程的创建方式区别
|-- 实现Runnable接口形式,可以实现线程操作的数据时共享数据
|-- 实现接口的形式,避免了单继承的局限性
9. 解决线程操作共享数据的安全问题,原理,就是一个线程不执行完毕,其他线程不能执行
|-- java为我们提供了同步技术,保证程序只有一个线程在运行
|-- 新的关键字 synchronized
格式 : synchronized(对象){
线程操作的共享数据
}
|-- 同步的原理:对象叫他锁 监视器
|-- 线程要想进入到同步代码块中执行的话,必须保证拥有对象锁,持有锁的线程,才能进入同步运行
没有锁的线程,只能在同步代码块外面排队等待,当线程运行结束后,释放锁,其他线程开始强锁
10. 模拟银行的存钱功能,2个窗口个窗口存3次,每次存储100元
结局是600元
同步方法,当一个方法中的数据全部都是线程操作的共享数据,定义同步方法,方法的定义的时候
加上synchronized关键字
非静态方法的同步锁是this,如果在非静态方法中,使用同步代码块,锁直接写this
如果方法是静态的,锁是谁?是类名.class class静态的成员属性,返回这个类的字节码文件对象
11. 死锁 *****
|-- 多线程同时抢一把锁,造成程序停止运行
|-- 面试的时候就可能
|-- 同步中,嵌套同步
12. 单例设计模式--保证对象在内存中的唯一性
|-- 饿汉式--没有问题的
|-- 懒汉式--加同步保证安全,双重if判断,提高效率
13. 模板方法设计模式
|-- 当定义一个功能时候,发现这个功能一半清楚,一半不清楚
|-- 将清楚的部分定义好,将不清楚的部分,对外暴露出去,等待子类来实现
==============================================================================
//模拟银行的存钱业务
//建立银行类,存钱的功能
class Bank
{
private static int sum = 0;
public static void add(int money){
synchronized(Bank.class){//类名.class
sum = sum + money;
System.out.println(sum);// 100 200 300 400 500 600
}
}
}
//定义储户类,调用银行的存钱功能
class Customer implements Runnable
{
Bank b = new Bank();
public void run(){
for(int x = 0 ; x < 3 ;x++){
b.add(100);
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Customer c = new Customer();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
// System.out.println("Hello World!");
}
}
=================================================================================================================
1. 多线程
|-- 什么是进程:正在运行的程序,占有的内存中的区域
|-- 线程:其实就是执行代码的独立控制单元,CPU执行代码的路径
2. java中对多线程的支持
|-- 线程也封装成对象,描述线程对象的类,java.lang.Thread类
|-- 创建线程的第一种方式:
|-- 将类,声明为Thread子类,继承Thread
|-- 重写Thread类的run方法
|-- 重写run方法原因:java工程师不知道以后的开发者会用线程运行哪些代码,规定了一个规范:
凡是写在run方法中的,代码,都是被线程执行的代码
|-- 建立Thread的子类对象
|--调用子类对象的start()方法
|-- 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
3. 多线程的随机性
|-- 我们程序中的线程,在被CPU执行,CPU先执行谁,执行时间,看CPU的心情
|-- 就是一个随机的,没有规律的结果
|-- JVM是单线程还是多线程程序?多线程,一条线程执行我们写的代码,一条收垃圾呢
4. 线程的状体图 *****
5. 设置和获取线程名
|-- 获取线程名字:public final String getName()默认 Thread-0
|-- 在不是Thread子类中,获取线程名称,在Thread类中提供了一个静态方法 currentThread(),
方法的运行结果,是当前正在执行的线程对象 public static Thread currentThread();
Thread.currentThread().getName();
|-- 设置线程名
|-- public final void setName(String name)
|-- new Thread(String name)
6. 使用多线程技术,模拟售票,一节车厢100张,多窗卖票
//定义类,票,模拟售票
class Ticket extends Thread{
private static int tickets = 100;
public void run(){
while(true){
if(tickets>0){
try{
Thread.sleep(5);
}catch(Exception e){}
System.out.println(getName()+"..出售第"+tickets--+"张票");
}
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
===========================================================================================================================================
7. 创建线程的方式二 步骤 重要
|-- 定义类实现Runnable接口
|-- 重写run方法
|-- 建立Thread对象,在构造方法中,传递Runnable接口的实现类对象
Thread(Runnable target)
|-- 调用Thread对象中的start方法,启动线程
8. 两种线程的创建方式区别
|-- 实现Runnable接口形式,可以实现线程操作的数据时共享数据
|-- 实现接口的形式,避免了单继承的局限性
9. 解决线程操作共享数据的安全问题,原理,就是一个线程不执行完毕,其他线程不能执行
|-- java为我们提供了同步技术,保证程序只有一个线程在运行
|-- 新的关键字 synchronized
格式 : synchronized(对象){
线程操作的共享数据
}
|-- 同步的原理:对象叫他锁 监视器
|-- 线程要想进入到同步代码块中执行的话,必须保证拥有对象锁,持有锁的线程,才能进入同步运行
没有锁的线程,只能在同步代码块外面排队等待,当线程运行结束后,释放锁,其他线程开始强锁
10. 模拟银行的存钱功能,2个窗口个窗口存3次,每次存储100元
结局是600元
同步方法,当一个方法中的数据全部都是线程操作的共享数据,定义同步方法,方法的定义的时候
加上synchronized关键字
非静态方法的同步锁是this,如果在非静态方法中,使用同步代码块,锁直接写this
如果方法是静态的,锁是谁?是类名.class class静态的成员属性,返回这个类的字节码文件对象
11. 死锁 *****
|-- 多线程同时抢一把锁,造成程序停止运行
|-- 面试的时候就可能
|-- 同步中,嵌套同步
12. 单例设计模式--保证对象在内存中的唯一性
|-- 饿汉式--没有问题的
|-- 懒汉式--加同步保证安全,双重if判断,提高效率
13. 模板方法设计模式
|-- 当定义一个功能时候,发现这个功能一半清楚,一半不清楚
|-- 将清楚的部分定义好,将不清楚的部分,对外暴露出去,等待子类来实现
==============================================================================
//模拟银行的存钱业务
//建立银行类,存钱的功能
class Bank
{
private static int sum = 0;
public static void add(int money){
synchronized(Bank.class){//类名.class
sum = sum + money;
System.out.println(sum);// 100 200 300 400 500 600
}
}
}
//定义储户类,调用银行的存钱功能
class Customer implements Runnable
{
Bank b = new Bank();
public void run(){
for(int x = 0 ; x < 3 ;x++){
b.add(100);
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Customer c = new Customer();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
// System.out.println("Hello World!");
}
}
=================================================================================================================
相关文章推荐
- 海外实习面试经历
- 黑马程序员_枚举
- 【黑马程序员】Socket编程实现内网连接的问题
- 黑马程序员——if、switch、while、for
- 黑马程序员------java5的枚举(枚举的原理、枚举的应用)
- 头文件string与string.h的区别
- 怎样准备软件工程师的面试
- 为程序员准备的7个社交网站
- DLL入门浅析(1)——如何建立DLL
- 黑马程序员------java5的一些简单新特性(静态导入、可变参数、增强for循环、自动拆箱装箱及享元)
- 黑马程序员-JavaBean
- 十五个只有程序员会乐的事情
- 面试题
- 2014腾讯校招面试之一总结
- 初次面试必须搞定的面试题
- 一道网易面试题的解法
- 阿里巴巴面试题
- 一道面试题
- 应聘面试自我介绍范文
- 黑马程序员-计算字符串中每种字符出现的次数