栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

代码中是否发生线程饥饿死锁?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

代码中是否发生线程饥饿死锁?

死锁和饥饿发生在以下行:

return header.get() + page + footer.get();

怎么样?
如果我们在程序中添加一些额外的代码,它将发生。可能是这样的:

    public void startThreadDeadlock() throws Exception    {        Future <String> wholePage = exec.submit(new RenderPageTask());        System.out.println("Content of whole page is " + wholePage.get());    }    public static void main(String[] st)throws Exception    {        ThreadDeadLock tdl = new ThreadDeadLock();        tdl.startThreadDeadLock();    }

导致死锁的步骤:

  1. exec
    通过
    Callable
    实现的类将任务提交给渲染页面
    RenderPageTask
    。
  2. exec
    开始
    RenderPageTask
    在单独的
    Thread
    ,唯一的
    Thread
    ,将提交执行其他任务
    exec
    顺序。
  3. call()
    将
    RenderPageTask
    另外两个任务的内部方法提交给
    exec
    。第一是
    LoadFileTask("header.html")
    ,第二是
    LoadFileTask("footer.html")
    。但是由于
    exec
    通过此处
    Executors.newSingleThreadExecutor();
    提到的代码获得的ExecutorService 使用了一个单一的工作线程,该工作线程在一个无限制的queueThread上运行,* 并且该线程已经被分配给RenderPageTask,因此, 它将被排队进入无限制的队列,等待那个线程的执行。 *
    LoadFileTask("header.html")``LoadFileTask("footer.html")``Thread
  4. RenderPageTask
    正在返回一个字符串,其中包含输出
    LoadFileTask("header.html")
    ,页面主体和输出的串联
    LoadFileTask("footer.html")
    。这三个部分
    page
    中的成功通过即可获得
    RenderPageTask
    。但是其他两个部分只能在由分配的单个线程执行两个任务之后获得
    ExecutorService
    。并且Thread仅在
    call()
    return方法之后才可用
    RenderPageTask
    。但是的
    call
    方法
    RenderPageTask
    仅在
    LoadFileTask("header.html")
    和
    LoadFileTask("footer.html")
    返回之后才返回。因此,不让
    LoadFileTask
    执行就导致 饥饿 。每个等待其他任务完成的任务都会导致 死锁,

我希望这可以弄清楚为什么上面的代码中发生线程饥饿死锁。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451512.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号