线程的四种状态:
新生状态、就绪状态、运行状态、阻塞状态和死亡状态。
新生状态通过new关键字来获得一个新生的线程对象、这个时候线程既没有内存也没有运行所以是新生状态
而后调用它的 start方法进入就绪状态,这个时候线程启动前的一些列准备都做好了,准备获得cpu调度
获得cpu调度以后就进入了运行状态这个时候线程已经在运行了,本来不可打断的但是有些方法可以中断线程的运行,进入阻塞状态
阻塞状态:sleep,使线程进入睡眠有时间限制当睡眠的时间已过线程重新进入就绪状态等待cpu的调用,join,插队,A线程在运行时被B线程调用join方法插队,这个时候A线程会让出cpu的使用权而让B线程运行完毕以后再接着进入就绪状态而后运行,wait,A线程在这个方法以后不会在运行会停下来等待其他线程运行,直到notify方法唤醒这个线程以后才可以继续运行。
死亡状态:所有的线程在完成或未完成任务以后都会进入死亡状态,让出cpu的使用权。
同步机制:
如何实现同步机制,使用synchronized关键字
同步的前提:
必须有两个或两个以上的线程
必须是多个线程使用同一资源
必须保证同步中只能有一个线程在运行
上锁可以锁变量也可以锁方法
同步可以保证资源共享操作的正确的性,但是过多同步会产生死锁问题。
多线程模拟卖票
package com.lx;
/**
* 多线程模拟的卖票
*
* @author Administrator
*
*/
/*
* 1. 设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,
* 用5个线程模拟这5个售票点的售票情况。
*/
public class Ticket implements Runnable {
Integer p = 100;
@Override
public synchronized void run() {
Thread c = Thread.currentThread();
String name = c.getName();
synchronized (p) {
if (p > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name + "卖了第" + p + "张票");
p--;
} else {
System.out.println("卖完了");
}
}
}
public static void main(String[] args) {
Ticket t = new Ticket();
for (int i = 0; i <= 20; i++) {
Thread z1 = new Thread(t);
z1.setName("窗口一");
Thread z2 = new Thread(t);
z2.setName("窗口二");
Thread z3 = new Thread(t);
z3.setName("窗口三");
Thread z4 = new Thread(t);
z4.setName("窗口四");
Thread z5 = new Thread(t);
z5.setName("窗口五");
z1.start();
z2.start();
z3.start();
z4.start();
z5.start();
}
}
}