线程从创建、运行到结束有五个状态:新生状态、就绪状态、运行状态、阻塞状态及死亡状态。
java中每个对象都有一个内置锁。
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
当程序运行到synchronized同步方法或代码块时该对象锁才起作用。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信。
多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行.在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信
wait()来让一个线程在某些条件下暂停运行
notify 仅仅通知一个线程,并且我们不知道哪个线程会收到通知,然而 notifyAll 会通知所有等待中的线程
notify只会通知到其中一个,而其它线程并不会收到任何通知,而notifyAll会唤醒所有等待中的线程。
1. 请你简述sleep( )和wait( )有什么区别?
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.
而wait(),首先,这是由某个确定的对象来调用的。
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
2. Java中实现线程通信的三个方法及其作用。
Java中实现线程通信的三个方法都是java.lang.Object类的方法。
都只能在同步方法或者同步代码块中使用,否则会抛出异常。
·wait() 表示线程一直等待,直到其它线程通知
· notify() 唤醒一个处于等待状态的线程。
·notifyAll() 唤醒同一个对象上所有调用wait()方法的线程
例题
1. 设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。
private int total=100;//有100张票
private int count=0;//卖出总数
@Override
public void run() {
while(total>0){
synchronized (this) {
if(total>0){
try {
//线程休眠100毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;//卖出越多
total--;//总数在减少
System.out.println(Thread.currentThread().getName()+"\t当前票号:"+count);
}
}
}
}
public static void main(String[] args) {
// 创建线程类对象
Tickets ts = new Tickets();
// 启动5次线程 共有5个售票点
for(int i=1;i<=5;i++){
new Thread(ts,"售票点:"+i).start();
}
}
}