smile_life_ 2017-12-19 03:06 采纳率: 40%
浏览 1042
已采纳

关于实现Runnable接口创建线程的测试问题,如图

图片说明

  • 写回答

5条回答

  • ZhihengTao 2017-12-19 05:52
    关注

    首先,两个线程使用的runnable对象是相同的,不考虑寄存器等缓存的因素,可以认为两个线程中看到的i是相同的,都是runnable对象的一个属性。
    其次,线程宏观上并行,但微观上不一定,和CPU的核数以及当前CPU的线程负载有关,所以常常有同一进程内线程交替执行的情况。为了保证程序的正确性,对于临界资源常常需要加锁。

    对于你的测试情况,可能的运行流程之一是:
    thread 1 (i=0 -> 20) [wait] -> thread 2 (i = 21-> 100) [destroy] -> thread 1 (i=100) [destroy]
    即你所说的“在线程1准备输出20的时候换到了线程2执行,执行完线程2后再执行线程1,因为线程1是执行了输出语句,只是在显示到控制台的路上”

    如果你想验证线程的切换,建议可以这样试一下:
    使用两个属性i,j,两个线程分别写其中一个,然后分别在两个线程中观察两个属性值。即:
    thread 1:
    i++; print i, j
    thread 2:
    j++; print i, j

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?