多线程的四种状态及同步机制的应用(火车票线程同步)
2017-08-12 16:52
330 查看
线程的四种状态:
新生状态、就绪状态、运行状态、阻塞状态和死亡状态。
新生状态通过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();
}
}
}
新生状态、就绪状态、运行状态、阻塞状态和死亡状态。
新生状态通过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();
}
}
}
相关文章推荐
- 多线程状态下使用同步机制的本质原因
- python3.4多线程实现同步的四种方式(锁机制、条件变量、信号量和同步队列)
- 多线程编程同步机制之互斥量编程实例
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- linux 多线程和同步机制的使用
- 状态保存机制之ViewState概述及应用
- 线程同步和异步区别 同步机制
- 线程_多线程_同步机制
- C++多线程-第五篇-同步机制
- Java精选笔记_多线程(创建、生命周期及状态转换、调度、同步、通信)
- 多线程访问同一个可变变量,需增加同步机制
- 【Java多线程】浅谈多线程机制(三)之互斥与同步
- Android应用开发学习笔记之多线程与Handler消息处理机制
- Java SE学习笔记:创建(Thread/Runable),线程安全,线程同步,同步锁机制
- 多进程多线程环境下的同步机制性能测试
- 【我的Java笔记】多线程安全问题 & 同步机制
- 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
- 多线程之旅之四——浅谈内存模型和用户态同步机制
- 剖析MFC多线程程序的同步机制
- 同步和异步关注的是消息通信机制,阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态