在java中,如果一个线程不想在特定的时间内执行任何操作,那么我们应该使用sleep()方法,这会导致当前正在执行的线程停止指定的毫秒数。
用法:
public static native void sleep( long ms) throws InterruptedException ; // The above method put the thread in sleep for a specified number of millisecond
public static void sleep(long ms , int ns) throws InterruptedException // The above method also put the thread in sleep for a specified number of milliseconds // plus specified number of nanoseconds
方法一: TimeUnit sleep()
java中的每个sleep()方法都会抛出一个 InterruptedException,这是一个受检查的异常,因此每当我们强制使用sleep方法时,我们应该通过try-catch或通过throws关键字来处理它,否则我们将得到编译时错误。
执行:在这里,我们让主线程在“打印“ 陈述。所以每张幻灯片打印需要 5 秒。
示例
Java
// Java Program to illustrate sleep method
// Importing all input output classes
import java.io.*;
// Importing all utility classes from
// java.util package
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
throws InterruptedException
{
// Iterating using simple for loops
for (int i = 0; i <= 10; i++) {
// Printing the current thread slide
System.out.println("slide-" + i);
// Putting the main thread to sleep for 5 second
Thread.sleep(5000);
}
// Here after every 5 seconds a slide will be
// printed
}
}
输出:
Note: Here slide-1 will be printed after slide-0 after 5000 nanoseconds so do apply for the rest of all the slides. Hence this output will be displayed taking a certain time in execution in the runtime state.
方法二:yield()方法
它会导致暂停当前正在执行的线程,以便为等待相同优先级的线程提供机会。如果没有等待线程或所有等待线程的优先级都较低,则同一线程可以继续执行。如果多个线程以相同的优先级等待,那么哪个等待线程将获得机会,我们不能说这取决于线程调度程序。线程何时再次获得yield机会也取决于线程调度程序。
用法:
public static native void yield( );
执行:
示例
Java
// Java Program to illustrate yield() method
// Importing input output classes
import java.io.*;
// Importing all utility classes
import java.util.*;
// Class 1
// Helper class extending Thread class
// Creating a thread in our myThread class
// by extending the Thread class
class myThread extends Thread {
// Method in helper class
// Declaring run method
public void run()
{
// Displaying the message
System.out.println("Child Thread");
// Calling yield() method
Thread.yield();
}
}
// Class 2
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
throws InterruptedException
{
// Creating a thread object in the main() method
// of our helper class above
myThread t = new myThread();
// Starting the above thread created
// using the start() method
t.start();
// Iterating using for loop
// over custom taken size equals 5
for (int i = 0; i < 5; i++) {
// Display message
System.out.println("Main Thread");
}
}
}
输出说明:
在上面的程序中,如果我们注释该行线程.yield()两个线程将同时执行,我们不能期望哪个线程先完成。如果我们不发表评论线程.yield()方法,因为主线程将获得更多机会,并且首先完成主线程的机会很高。
至此,我们就完成了这两种方法,最后总结一下它们之间的区别。
属性 | 产量法 | 睡眠法 |
---|---|---|
Purpose | 如果一个线程想要暂停其执行,以便为具有相同优先级的剩余线程提供机会,那么我们应该使用yield 方法。 | 如果线程不想在特定时间内执行任何操作,那么我们应该使用 sleep 方法 |
Over-loading | 该方法没有重载 | sleep 方法超载。 |
Exception | 这个方法不会抛出异常 | 此方法会抛出中断异常 |
本国的 | 这个方法是原生的 | 两个重载方法中,只有sleep(long ms)被重载,另一个没有重载。 |
放弃显示器 | 此方法放弃监视器。 | 此方法不会导致当前正在执行的线程放弃监视器。 |
相关用法
- Java stream.limit()用法及代码示例
- Java streams counting()用法及代码示例
- Java sqrt()用法及代码示例
- Java signum()用法及代码示例
- Java super()和this()的区别用法及代码示例
- Java string转boolean用法及代码示例
- Java super和super()的区别用法及代码示例
- Java String compareToIgnoreCase()用法及代码示例
- Java String compareTo()用法及代码示例
- Java String split()用法及代码示例
- Java String length()用法及代码示例
- Java String replace()用法及代码示例
- Java String replaceAll()用法及代码示例
- Java String substring()用法及代码示例
- Java String equals()用法及代码示例
- Java String equalsIgnoreCase()用法及代码示例
- Java String contains()用法及代码示例
- Java String indexOf()用法及代码示例
- Java String trim()用法及代码示例
- Java String charAt()用法及代码示例
- Java String toLowerCase()用法及代码示例
- Java String concat()用法及代码示例
- Java String valueOf()用法及代码示例
- Java String matches()用法及代码示例
- Java String startsWith()用法及代码示例
注:本文由纯净天空筛选整理自mroshanmishra0072大神的英文原创作品 Difference Between sleep and yield Method in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。