多线程的学习
博客专区 > wuyiyi 的博客 > 博客详情
多线程的学习
wuyiyi 发表于11个月前
多线程的学习
  • 发表于 11个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 线程的状态、死锁

1.线程的状态:

1)新建状态:当用new操作符创建一个线程时,例如new Thread(),线程还没有开始运行,此时线程正处在新建状态。当一个线程处于新生状态时,程序还没有运行线程中的代码

2)就绪状态(runnable):一个新建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争cpu,只有获得cpu时间才可以运行线程。因为在单cpu的计算机系统中,不能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此可能有多个线程处于就绪状态。对于处于就绪状态的线程是由java运行时系统的线程调度程序来调度的。

3)运行状态(running)

当线程获得cpu时间后,它才进入运行状态,真正开始执行run()方法。

4)阻塞状态(blocked) 

线程进入阻塞状态有:

a、线程通过调用sleep方法进入睡眠状态

b、线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者

c、线程试图获取一个锁,而该锁被其他线程调用

d、线程在等待某个出发条件

5)死亡状态(dead)

a、run方法正常退出而自然死亡

b、一个未捕获的异常终止了run方法而使线程猝死

判断线程是否存活(可运行、被阻塞)可使用isAlive。

2.死锁产生的原因及必要条件

原因:1)系统资源不足;2)进程运行推进的顺序不合适;3)资源分配不当

必要条件:1)互斥条件:一个资源只能被一个线程使用

                 2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源不释放

                 3)不剥夺条件:进程已获得的资源,在未使用完之前,不会被释放

                  4)循环等待条件:若干进程形成一种头尾相接的循环等待资源关系。

3.使用synchronized,wait,notify。生产者、消费者问题

public synchronized void produce() {
    if (this.product >= MAX_PRODUCT) {
        try {
            wait();
            System.out.println("产品已满,请稍后");
            return;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    product++;
    System.out.println("生产者生产第" + this.product + "个产品.");
    notifyAll();
}

public synchronized void consume(){
    if (this.product <= MIN_PRODUCT ){
        try {
            wait();
            System.out.println("产品已消耗完,请稍后");
            return;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    product--;
    System.out.println("消费者取走了第" + this.product + "个产品.");
    notifyAll();
}
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 21
码字总数 8594
×
wuyiyi
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: