------- android培训、java培训、期待与您交流! ----------
1. 进程
|-- 就是一个应用程序,在内存中的所占区域2. 线程
|-- 就是进程中的一条执行路径,看做是进程中的小子程序
|-- 提高的程序的运行效率,可以保证多个线程一起运行
3. 虚拟机,肯定多线程程序
4. 建立线程的第一种方法(了解)
|-- 继承Thread类
|-- 覆盖掉run方法
|-- 建立Thread子类对象
|-- 调用start方法
5. 线程的随机性
|-- CPU控制线程的执行
|-- CPU进行线程中的切换,随机性,我们控制不了
6. 线程的状态图(*********)
7. 售票的实例,引出了第二种创建线程的方式(*******)
|-- 实现Runnable接口,覆盖run方法
|-- 建立Thread类对象,传递实现Runnable接口的子类对象
|-- 调用Thread类中的run方法
|-- 第二种方式,可以实现对象中的数据共享
|-- 避免的单继承的局限性
- /*
- 售票 票数量是固定的 100张
- 火车站卖 ,代售点
- 使用多线程技术,模拟窗口的售票(4个窗口,线程)
- 4个线程对象,每个对象中,都有100张票,数据错乱了
- 解决:这些对象,需要共享100张票 static
- 静态的生命太长了
- 建立线程的第二个方法(********)
- 步骤:
- 建立实现Runnable接口的实现类
- 重写了run方法
- 创建Thread类对象,传递Runnable接口的子类对象
- 调用Thread类中的start方法
- start方法开启线程,并调用Runnable接口子类对象中的run方法
- 继承Thread类,和实现Runnable接口的区别
- 1. 实现Runnable接口的方式,可以共享数据‘
- 2. 避免了继承的局限性
- Thread t1 = new Thread(t)
- public Thread(Runnable target)多态 Runnable target = new Ticket();
- 线程中,最倒霉的事情,就是安全隐患
- 1. 一个数据被多线程操作
- 2. 这个数据,是多线程的共享数据
- */
- class Ticket implements Runnable
- {
- private int ticket = 100;
- public void run()
- {
- while(true)
- {
- if(ticket>0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch (Exception e)
- {
- }
- System.out.println(Thread.currentThread().getName()+" 以出售第 "+ticket--);
- }
- }
- }
- }
- /*
- class Ticket extends Thread
- {
- private static int ticket = 100;
- public void run()
- {
- while(true)
- {
- if(ticket>0)
- {
- System.out.println(getName()+" 以出售第 "+ticket--);
- }
- }
- }
- }*/
- class ThreadDemo2
- {
- public static void main(String[] args)
- {
- Ticket t = new Ticket();//创建了一个线程??不是
- Thread t1 = new Thread(t);//创建了一个线程
- Thread t2 = new Thread(t);//创建了一个线程
- Thread t3 = new Thread(t);//创建了一个线程
- Thread t4 = new Thread(t);//创建了一个线程
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- /*
- Ticket t1 = new Ticket();
- Ticket t2 = new Ticket();
- Ticket t3 = new Ticket();
- Ticket t4 = new Ticket();
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- */
- }
- }
- /*
- 如何解决错票问题
- 如何搞定多线程的安全隐患
- 原理,一个线程运行结束后,才能允许后面的线程进来运行
- 介绍一个新的关键字 synchronized 同步
- 应用在什么地方,应用在线程操作的共享数据中
- 同步的固定格式:同步代码块
- synchronized(对象----任意的对象都行)
- {
- 线程操作的共享数据
- }
- 解决安全为题,但是仍然数据错乱
- 1. 是不是多线程的程序
- 2. 这些线程是不是持有同一把锁
- */
- class Ticket implements Runnable
- {
- private int ticket = 100;
- Object obj = new Object();
- public void run()
- {
- while(true)
- {
- synchronized(obj)
- {
- if(ticket>0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch (Exception e)
- {
- }
- System.out.println(Thread.currentThread().getName()+" 以出售第 "+ticket--);
- }
- }
- }
- }
- }
- class ThreadDemo3
- {
- public static void main(String[] args)
- {
- Ticket t = new Ticket();//创建了一个线程??不是
- Thread t1 = new Thread(t);//创建了一个线程
- Thread t2 = new Thread(t);//创建了一个线程
- Thread t3 = new Thread(t);//创建了一个线程
- Thread t4 = new Thread(t);//创建了一个线程
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- /*
- Ticket t1 = new Ticket();
- Ticket t2 = new Ticket();
- Ticket t3 = new Ticket();
- Ticket t4 = new Ticket();
- t1.start();
- t2.start();
- t3.start();
- t4.start();
- */
- }
- }
8. 安全问题
9. 同步代码块
synchronized(this) ****同步
{
}
synchronized(类名.class)
{
}
10. 安全问题的解决
|-- 数据被多个线程访问
|-- 这些线程是不是持有同一把锁
11. 死锁的案例(*******)
|-- 记住代码,面试
- //开发不可能,面试常问
- /*
- 死锁实例
- 造2把锁 A B
- 产生了同步嵌套
- */
- class Dead implements Runnable
- {
- boolean b = false;
- public void run()
- {
- while(true)
- {
- if(b)
- {
- synchronized(LockA.locka)//2 locka
- {
- System.out.println("if...locka");//2 locka
- synchronized(LockB.lockb)
- {
- System.out.println("if...lockb");
- }
- }
- }
- else
- {
- synchronized(LockB.lockb)//1 lockb
- {
- System.out.println("else...lockb");// lockb
- synchronized(LockA.locka)
- {
- System.out.println("else...locka");
- }
- }
- }
- }
- }
- }
- class LockA
- {
- public static LockA locka = new LockA();
- }
- class LockB
- {
- public static LockB lockb = new LockB();
- }
- class DeadLock
- {
- public static void main(String[] args)
- {
- Dead d1 = new Dead();//false
- Thread t1= new Thread(d1);
- Dead d2 = new Dead();//true
- d2.b=true;
- Thread t2 =new Thread(d2);
- t1.start();
- t2.start();
- }
- }
12. 安全高效的懒汉式(******) 面试
- class Single
- {
- private Single(){}
- private static Single s = null;
- public static Single getInstance()
- {
- if(s==null)
- {
- synchronized(Single.class)
- {
- if(s==null)
- {
- try{Thread.sleep(15);}catch(Exception e){}
- s = new Single();
- }
- return s;
- }
- }
- return s;
- }
- }
- class TestSingle implements Runnable
- {
- public void run()
- {
- while(true)
- {
- Single s = Single.getInstance();
- System.out.println(s);
- }
- }
- }
- class SafeSingle
- {
- public static void main(String[] args)
- {
- TestSingle t = new TestSingle();
- Thread t1 = new Thread(t);
- Thread t2 = new Thread(t);
- t1.start();
- t2.start();
- }
- }
13. Thread方法
|-- run负责线程中运行的代码
|-- Thread(String name),构造的时候,传递线程名
|-- getName()获取线程名
|-- setName()设置线程名
|-- Thread.currentThread().getName()获取线程名,在非Thread子类中使用
|-- start()开启线程,JVM调用线程的run方法