线程概述:


多线程:


 线程是依赖者进程存在的


 


 进程:


  正在运行的程序,是系统进行资源分配和调用的独立单位。


  每一个进程都有它自己的内存空间和系统资源。


线程:


  是进程中的单个顺序控制流,是一条执行路径


  一个进程如果只有一条执行路径,则称为单线程程序。


  一个进程如果有多条执行路径,则称为多线程程序


 


-----------------------------


单进程单线程:


单进程多线程:一座大桥, 同时可以有多辆汽车行驶


多进程多线程:多座大桥,每座桥上,都可以同时可以有多辆汽车行驶




如何创建一个线程呢? 


 想创建线程,那么要先有进程,而进程我们创建不了,由系统来创建,我们在进程的基础上,创建线程 ( 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 的子类应该重写该方法。
 
   
 
------------------将此方法重写     如:  
 
          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
}
// }


}
 }