您的位置:首页 > 职场人生

黑马程序员_多线程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!");
}

}

=================================================================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: