多线程的生命周期
线程所拥有的状态:初始状态,可运行状态,运行状态,阻塞状态,锁池状态,等待队列,终止状态。
线程的生命状态:
1.当线程类被创建后就进入初始化状态。
2.当调用.start()方法时就拿到对象锁,进入可运行状态(一旦获取cpu资源就会进入运行状态)
3.当处于可运行状态的线程拿到cpu分配的时间片就进入运行状态。
1)如果处于运行状态的线程的main方法或是run方法执行完,线程就进入终止状态。
2)如果当前处于运行状态的线程调用sleep()方法或是join()方法,线程就进入阻塞状态。此时不释放资源(主要指对象锁)。当睡眠时间结束后进入可运行状态,等待获取cpu的时间片。
3)当处于运行状态的当前线程调用yield方法,线程就会放弃当前时间片回到可运行状态。和其他线程再次竞争。
4)当进入运行状态的线程调用wait方法后就会进入等待状态。只有调用了notify(只唤醒一个线程不确定唤醒哪个线程)或是notifyAll方法会后进入锁池状态。拿到对象锁标记后会进入可运行状态。
5)当运行状态的线程发现要使用的资源被同步时,会进入锁池状态,当拿到对象锁后会进入可运行状态。
多线程的创建
多线程的实例解读
1. 多个窗口同时卖票,利用多线程模拟售票程序
package com.cnwir.test;
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket =new Ticket(20);
for (int i = 0; i < 5; i++) {//5个线程
new Thread(new Seller(ticket),String.valueOf(i)).start();//线程启动
}
}
}
/**
* 卖票线程类
* @author administrator
*
*/
class Seller implements Runnable{
Ticket ticket;
public Seller(Ticket ticket) {
// TODO Auto-generated constructor stub
this.ticket =ticket ;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (ticket.has) {//如果有票继续售,否则终止售票
ticket.sellerTicket();//
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 定义票信息类
* @author administrator
*
*/
class Ticket {
private int ticketCount;
protected boolean has=true ;//是否有票
public Ticket(int ticketCount) {
// TODO Auto-generated constructor stub
this.ticketCount=ticketCount;
}
public synchronized void sellerTicket() {
if(ticketCount>0){
System.out.println(Thread.currentThread().getName()+"窗口卖第"+ticketCount+"张票");
ticketCount--;
}else{
System.out.println("票已经售完!");
has=false;//票已售完
}
}
}//end