栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号