线程方面

 线程从创建、运行到结束有五个状态:新生状态、就绪状态、运行状态、阻塞状态及死亡状态。

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个售票点的售票情况。


public class Tickets implements Runnable{
    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();
        }
    }

}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值