线程概述:
多线程:
线程是依赖者进程存在的
进程:
正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:
是进程中的单个顺序控制流,是一条执行路径
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序
-----------------------------
单进程单线程:
单进程多线程:一座大桥, 同时可以有多辆汽车行驶
多进程多线程:多座大桥,每座桥上,都可以同时可以有多辆汽车行驶
如何创建一个线程呢?
想创建线程,那么要先有进程,而进程我们创建不了,由系统来创建,我们在进程的基础上,创建线程 ( 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
}
// }
}
}