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

黑马程序员—java技术blog—第十四篇线程基础概述

2015-09-27 16:31 344 查看
------- <a href="http://www.itheima.com"
target="blank">android培训</a>、<a href="http://www.itheima.com"

线程概述:
多线程:
 线程是依赖者进程存在的
 
 进程:
  正在运行的程序,是系统进行资源分配和调用的独立单位。
  每一个进程都有它自己的内存空间和系统资源。
 线程:
  是进程中的单个顺序控制流,是一条执行路径
  一个进程如果只有一条执行路径,则称为单线程程序。
  一个进程如果有多条执行路径,则称为多线程程序
 
-----------------------------
单进程单线程: 一个独木桥,同时只能有一个人过;多个人的时候排队,依次通过
单进程多线程:一座大桥, 同时可以有多辆汽车行驶
多进程多线程:多座大桥,每座桥上,都可以同时可以有多辆汽车行驶

如何创建一个线程呢?  
 想创建线程,那么要先有进程,而进程我们创建不了,由系统来创建,我们在进程的基础上,创建线程 ( Thread )

 Thread类:
  是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

创建线程的几种方式?(重点)
 创建新执行线程有两种方法
 方式1:
  继承Thread线程类
  1,创建一个类为 Thread类的子类
  2,该子类应重写 Thread 类的 run 方法
  3,创建子类对象
  4,调用start()方法,启动线程
 
 方式2;
  创建一个实现 Runnable 接口的类
  1,创建自定义类实现 Runnable接口
  2,在自定义类重写run()方法
  3,创建自定义类对象
  4,创建线程对象,并把自定义类对象,作为构造方法参数使用
  5,调用start()方法,启动线程

面试题:线程的生命周期

--------------------------------
面试题:
 问:启动线程  使用的是start()方法 还是 run()方法??
  启动线程  使用的是start()方法
 
 public void start()
  使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
 public void run()
  指定每一个线程启动后,要执行的操作

----------------------------------
Thread类方法介绍----------线程类
    创建线程的基本方法---------------    User
u=new User();----User类实现了Runnable接口的
                                                        Thread
t=new Thread(u);
 * 构造方法:
 * public Thread(String name)分配新的 Thread 对象----------给对象起名字
 * 方法:
 * public final String getName()返回该线程的名称。
 * 默认的线程名称为: Thread-编号, 编号从0开始
 * public final void setName(String name)
 * 改变线程名称,使之与参数 name 相同
 
   public static Thread currentThread()
    返回对当前正在执行的线程对象的引用。
    返回:当前执行的线程
   public final int getPriority()返回线程的优先级。
   public final void setPriority(int newPriority)更改线程的优先级
       IllegalArgumentException - 如果优先级不在 MIN_PRIORITY 到 MAX_PRIORITY 范围内。
       IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数
     
    public static final int MAX_PRIORITY 10  最大优先级
    public static final int MIN_PRIORITY 1 最小优先级
    public static final int NORM_PRIORITY 5 默认优先级
 
    public static void sleep(long millis)
                  throws InterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),

-----------------------------------------
   public void run() :
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何  操作并返回。
    Thread 的子类应该重写该方法。
   
      public void run() {------------------将此方法重写     如:   public void run()
{
          if (target != null) {                                                        for (int i = 1; i <= 100; i++) {
              target.run();                                                                 System.out.println(getName() +"=="+ i);
          }                                                                                                    }
      }
综合案例1:
多个售票员一起卖电影票案例

 * 

 * 票 class Ticket

 * 售票员 (线程)

 * 

 * ------------------------

 * 发现模拟真实卖票出现的问题

 * 1,重复的票

 * 2,负数的票

 * 

 * -----------------------

 * 解决上述的问题

 * 通过线程的同步机制来解决问题

 * 线程的同步机制 就是 保证线程安全

 * 

 * 线程安全 -- 线程同步  -- Vector

 * 线程不安全 -- 线程不同步 -- ArrryList

 * 

 * --------------------------

 * 同步机制的实现方式:

 * 1, 同步代码块

 * 格式:

 * synchronized(锁对象) {

 * 可能出现线程不同步问题的代码

 * }

 * 这里的锁对象,可以是任何创建的对象

 * 

 * 2, 同步方法

 * 普通同步方法

 * 

 * 静态同步方法

 * 

 */

public class TicketThread {
public static void main(String[] args) {
//票
Ticket ticket = new Ticket();

//创建3个售票员
Thread t1 = new Thread(ticket, "售票员1号");
Thread t2 = new Thread(ticket, "售票员2号");
Thread t3 = new Thread(ticket, "售票员3号");
//启动线程
t1.start();
t2.start();
t3.start();
}

}

public class Ticket implements Runnable {

private int ticket = 100;// 剩余票数
private Object lock = new Object();// 任何的对象都可以作为锁

@Override
public void run() {
while (true) {
// t1,t2,t3
method();
}
}
// 同步方法
private synchronized void method() {
// synchronized( lock ){// synchronized 线程同步,锁
if (ticket > 0) {// 有票就卖票 ticket = 1;
// 模拟选座位
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// t1,t2,t3
System.out.println(Thread.currentThread().getName() + "--正在卖 "
+ ticket);// 1,0,-1
ticket--;// 剩余票数0,-1,-2
}
// }

}

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