我yield()
对Java 中方法的使用有些困惑,尤其是在下面的示例代码中。我也读过yield()是“用来防止执行线程的”。
我的问题是:
我相信下面的代码在使用yield()
和不使用时都会产生相同的输出。这样对吗?
实际上,的主要用途是yield()
什么?
在哪些方面yield()
从不同join()
和interrupt()
方法?
代码示例:
public class MyRunnable implements Runnable {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
for(int i=0; i<5; i++) {
System.out.println("Inside main");
}
}
public void run() {
for(int i=0; i<5; i++) {
System.out.println("Inside run");
Thread.yield();
}
}
}
无论是否使用,我都使用上面的代码获得相同的输出yield()
:
Inside main
Inside main
Inside main
Inside main
Inside main
Inside run
Inside run
Inside run
Inside run
Inside run
资料来源: http :
//www.javamex.com/tutorials/threads/yield.shtml
视窗
在Hotspot实现中,
Thread.yield()
Java 5和Java 6之间的工作方式发生了变化。在Java 5中,
Thread.yield()
调用Windows API调用Sleep(0)
。这具有 清除当前线程的数量 并将 其
放在优先级级别
的队列末端
的特殊效果。换句话说,具有相同优先级的所有可运行线程(以及具有更高优先级的那些线程)将有机会在下一个给定的CPU时间之前让出线程运行。当最终对其进行重新计划时,它将返回完整的完整量子,但不会从屈服之时“继承”任何剩余的量子。此行为与非零睡眠略有不同,在非零睡眠中,睡眠线程通常会丢失1个量子值(实际上是10毫秒或15毫秒滴答的1/3)。在Java 6中,此行为已更改。现在,热点VM
Thread.yield()
使用Windows
SwitchToThread()
API调用实现。该调用使当前线程 放弃其 当前时间片 ,而不是其整个 时间片
。这意味着,可以根据其他线程的优先级, 在一个中断周期后将回退 线程 调度回去
。(有关时间片的更多信息,请参见线程调度部分。)的Linux
在Linux下,热点仅调用
sched_yield()
。此调用的结果略有不同,并且可能比Windows下更为严重:
- 直到 所有 其他线程都具有一个 CPU片时,产生的线程才会获得另一个CPU 片 ;
* (至少在内核2.6.8及更高版本中),调度程序在其最近的CPU分配上的试探法隐含地考虑了线程已产生的事实,因此,隐式地,在执行以下操作时,可以给已产生的线程更多的CPU资源:未来。
(有关优先级和调度算法的更多详细信息,请参见线程调度部分。)
什么时候使用
yield()
?我 几乎不会 说。它的行为不是标准定义的,通常有更好的方法可以执行您可能要使用yield()执行的任务:
- 如果您 只 尝试 使用一部分CPU ,则可以通过控制线程在最后一个处理块中使用了多少CPU,然后 休眠
一段时间来进行补偿,以更可控的方式进行操作:请参见的睡眠()方法;- 如果您正在 等待进程或资源
完成或变得可用,则有更有效的方法来完成此操作,例如通过使用join()等待另一线程完成,使用等待/通知机制允许一个线程通知另一个任务已完成,或者最好使用Java
5并发结构之一(例如信号量或阻塞队列)来通知任务。
问题内容: 我知道一个区别: 如果我们说,该线程肯定会休眠数毫秒,而没有这样的保证。这对于线程调度很有用,因为调用的线程可以立即重新选择好运行。 还有什么? 问题答案: 只是说:现在是让另一个线程运行的好时机,这对调度程序来说是一个提示。确实做到了:至少在给定的时间睡觉。
问题内容: 似乎该线程都在其他线程调用或在此线程上唤醒。两者之间有什么区别吗? - 编辑 - 我知道一个是通知对象,另一个是中断线程。但是,这两种情况都会导致相同的结果,也就是说,该线程被唤醒,所以我想问的是这两种情况的后果是如何不同的。 问题答案: 当线程在某个监视器上调用notify时,它将唤醒在该监视器上等待的单个线程,但是 哪个 线程被唤醒由调度程序决定。(或者,一个线程可以调用notif
Flink被比作Spark,在我看来,这是一个错误的比较,因为它将窗口事件处理系统与微批处理进行了比较;同样地,对我来说,将Flink与Samza进行比较也没有那么大的意义。在这两种情况下,它比较了实时事件处理策略和批处理事件处理策略,即使在Samza的情况下“规模”较小。但我想知道Flink与Storm的比较如何,它在概念上似乎更相似。 我发现这张(幻灯片#4)记录了Flink的“可调延迟”这一
问题内容: 和之间有什么区别?我可以举个例子吗? 问题答案: 逐个查询放置一行,同时生成笛卡尔乘积并对其进行子集化-完全不同的操作。琐碎的例子: 的类似的琐碎示例:
问题内容: 我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法。 好的,但是为什么我们需要操纵字节码? 有什么真实的例子吗?任何真正的应用程序,javassist在哪里使用? 问题答案: 一个常见的应用是在运行时生成代理类,即在运行时创建一个子类,以拦截所有方法调用。例子: Hibernate 使用代理来拦截对实体的方法调用以实现延迟加载,即,在首次访问对象时从
本文向大家介绍什么是REST/RESTful ?它的用途是什么?相关面试题,主要包含被问及什么是REST/RESTful ?它的用途是什么?时的应答技巧和注意事项,需要的朋友参考一下 Representational State Transfer(REST)/ RESTful (表述性状态转移)是一种帮助计算机系统通过 Internet 进行通信的架构风格。这使得微服务更容易理解和实现。 微服务可