线程同时启动讨论

椰树海岛 2014-06-06 09:47:46
我同事去腾讯面试,有道问题我印象深刻,如下:
类似赛车游戏.比如说跑跑卡丁车吧,一共8辆车同时开跑,这个线程如何启动.
估计是考wait和notify方法问题.

我自己也想了很多,什么线程池啊一类的,但是我同时也是这么一说,那位面试官说不是这样实现的.

我自己的答案是:用一个list存放8辆车的线程.等倒计时到0之前是wait,0秒后循环集合notify.
不能用notifyAll,因为会把别的线程给全启动了.

但是线程是有调度的,不可能同时启动.这是我疑惑的原因,怎么样才能说是同时.
或许可以不考虑毫秒之间的差异.

希望有做过类似的游戏的朋友解解疑惑,也欢迎大家讨论讨论,看看还有没有其它更好的方法.
...全文
1670 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
末日哥 2014-06-09
  • 打赏
  • 举报
回复
引用 12 楼 magi1201 的回复:
[quote=引用 10 楼 fudongrifdr 的回复:] 闭锁
元首,相亲回来了啊 [/quote] 相亲还早
椰树海岛 2014-06-07
  • 打赏
  • 举报
回复
引用 10 楼 fudongrifdr 的回复:
闭锁
引用 5 楼 ygycomon 的回复:
CountDownLatch
两位朋友说的应该是我需要的答案 这里有个链接,说闭锁的概念和例子的 http://blog.csdn.net/lmc_wy/article/details/7866863

1、闭锁是一种synchronizer,它可以延迟线程的进度直到线程到达终止状态。
2、CountDownLatch是一个灵活的闭锁实现:
1) 允许一个或多个线程等待一个事件集的发生,闭锁的状态包括一个计数器,初始化为一个正数,用来实现需要等待的事件数。
2)countDown对计数器做减操作,表示一个事件已经发生了,而await方法等待计数器达到0,此时所有需要等待的事件都已经发生。
3)如果计数器的入口时值为非零,await会一直阻塞直到计数器为0,或等待线程中断及超时。
3、
使用CountDownLatch启动和停止线程
xlight2023 2014-06-07
  • 打赏
  • 举报
回复
他们应该是用闭锁来解决这种问题的。
lcf 2014-06-07
  • 打赏
  • 举报
回复
面试的是假设8人拿8个手柄在同一台电脑上玩耍,所以需要8个线程?还是说8个线程不是在同一台机子上的,各自要等绿灯然后一起开始?
致知Fighting 2014-06-06
  • 打赏
  • 举报
回复
CountDownLatch
vnvlyp 2014-06-06
  • 打赏
  • 举报
回复
你要真正做到几个线程同时启动是几乎不可能的,因为第一你不能保证硬件上有足够多的并行处理单元(比如你只有一个单核CPU是不可能同时跑8个线程的) 第二,操作系统有复杂的线程调度机制,不同的操作系统机制是不同的,你可能在一个操作系统上实现了同步,但另外一个操作系统上就行不通了,而且实际上就算在一个特定的操作系统上也是不可能实现的,因为变量太多,你无法限制环境中其他线程的行为。 第三,你用Java那更加不可能了,Java还有一层虚拟机,虚拟机的干涉管理也是会影响线程具体表现的。 但你要是就一个赛车开始问题,有必要追求极致同步吗?就依次启动几个线程,最后一个与第一个差距也就1ms,而人反应时间至少都要几十ms,如果低于这个时间,你完全可以忽视他的操作,认为他作弊。
yufengdxw 2014-06-06
  • 打赏
  • 举报
回复
需要8个吗? 你开自己的车启动一个线程,别人的车又不是你控制,只要拿到它们的状态就行吧,再开启适当线程拿它们的状态就行。 个人意见...
曼珠沙华糯米 2014-06-06
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
启动8个线程瞬间的事,玩家按↑的误差远大于启动8个线程的时间。完全可以忽略线程启动的时间差
teemai 2014-06-06
  • 打赏
  • 举报
回复
启动8个线程瞬间的事,玩家按↑的误差远大于启动8个线程的时间。完全可以忽略线程启动的时间差
姜小白- 2014-06-06
  • 打赏
  • 举报
回复
引用 10 楼 fudongrifdr 的回复:
闭锁
元首,相亲回来了啊
椰树海岛 2014-06-06
  • 打赏
  • 举报
回复
引用 10 楼 fudongrifdr 的回复:
闭锁
什么情况.能给个参考或者链接?
末日哥 2014-06-06
  • 打赏
  • 举报
回复
闭锁
椰树海岛 2014-06-06
  • 打赏
  • 举报
回复
引用 6 楼 xiaopeipei2004 的回复:
我觉得线程不能也不必做到同时启动,每个线程拥有自己的距离和时间,做为维度。 每个线程按一定频率取其他线程状态做显示,真实发生线程间交互的时候(如发技能),去目标线程的维度按时间去取距离。 所以平时显示上可能有误差,但是可以容忍的。交互的时候是准确的。
我也想知道我所想的是否是设计中的答案.我在模拟现场启动时就是出现了几毫秒的误差. 我所理解的现场是有调度的.有虚拟机控制,无法人为控制.和面试官所说的有出入.
椰树海岛 2014-06-06
  • 打赏
  • 举报
回复
引用 4 楼 vnvlyp 的回复:
你要真正做到几个线程同时启动是几乎不可能的,因为第一你不能保证硬件上有足够多的并行处理单元(比如你只有一个单核CPU是不可能同时跑8个线程的) 第二,操作系统有复杂的线程调度机制,不同的操作系统机制是不同的,你可能在一个操作系统上实现了同步,但另外一个操作系统上就行不通了,而且实际上就算在一个特定的操作系统上也是不可能实现的,因为变量太多,你无法限制环境中其他线程的行为。 第三,你用Java那更加不可能了,Java还有一层虚拟机,虚拟机的干涉管理也是会影响线程具体表现的。 但你要是就一个赛车开始问题,有必要追求极致同步吗?就依次启动几个线程,最后一个与第一个差距也就1ms,而人反应时间至少都要几十ms,如果低于这个时间,你完全可以忽视他的操作,认为他作弊。
我只是比较纠结面试官所指的同时这个词.我也想了解一下如果是游戏中这个是怎么设计的
lliiqiang 2014-06-06
  • 打赏
  • 举报
回复
不可能同时启动,随机启动吧.
grapepaul 2014-06-06
  • 打赏
  • 举报
回复
我觉得线程不能也不必做到同时启动,每个线程拥有自己的距离和时间,做为维度。 每个线程按一定频率取其他线程状态做显示,真实发生线程间交互的时候(如发技能),去目标线程的维度按时间去取距离。 所以平时显示上可能有误差,但是可以容忍的。交互的时候是准确的。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧