线程:用来执行代码。
进程:用来封装线程并线程提供资源。
1. 开启线程之继承Thread
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("执行了线程的run方法");
}
主线程:Java程序在启动过程自动创建的并执行main方法的线程就是主线程。
子线程:除了主线程以外的所有线程都是子线程
2. 线程的运行模式
分时式模式:每个线程平均分配CPU的使用权
抢占式模式:优先级高的线程优先使用CPU的使用权,使用频率高,使用时间长,如果是优先级相同,则多个线程去争夺CPU的使 用权。Java的多线程是属于抢占式模式。
3.线程的状态
新建:刚刚创建出来
* 就绪:调用start()方法进入该状态
* 运行:获得CPU的执行权
* 阻塞:调用了sleep()或wait()方法
* 死亡:调用stop()或任务执行完成。
4.卖票案例
public class SaleTicket { //主线程
public static void main(String[] args) {
Ticket t1 = new Ticket("美女A");
Ticket t2 = new Ticket("美女B");
t1.start();
t2.start();
}
}
public class Ticket extends Thread {
//记录总票数
public static int tickets = 100;
public Ticket(String name) {
super(name);
}
@Override
public void run() {
while(true) {
if(tickets > 0) {
try {
Thread.sleep(2000);
System.out.println(this.getName()+"卖出一张票,还剩下"+(--tickets)+"张");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("票卖完了");
break;
}
}
}
注:出现了线程安全问题
4.解决线程安全问题
同步代码块执行原理:同步代码块能够保证同一时间只能有一个线程执行代码块中的代码。
synchronized(锁对象){
// 多个线程要操作资源代码
}
注:锁对象可以是任意对象, 锁对象必须是所有线程共享的对象
同步方法:
修饰符 synchronized 返回类型 方法名(参数列表) {
// 多个线程要操作资源代码
}
同步成员方法有锁对象是:this
同步静态方法锁对象是:类名.class
start()方法和run()方法有什么区别?
* start()会开辟一个新的执行路径(会创建线程)
* run()不会开启线程,在当前线程执行。
* start()方法内部调用了run方法