作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
据我所知,sleep()
用于让线程 hibernate 指定时间。我做了两个示例 - 在示例 1 中,我得到的输出为 1
,2
, 3
,4
因为我只创造了一个。在示例 2 中,我创建了线程的 2 个实例,并得到输出 1
,1
,2
,2
,3
,3
,4
,4
。
为什么第一个线程的输出不是 1
、2
、3
、4
,然后是 1
,2
,3
,4
是第二个吗?
示例 1:
// Using sleep() method
public class Aaa extends Thread{
public void run(){
for(int i=1;i<5;i++){
try{
Thread.sleep(500);
} catch(InterruptedException e){
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String[] args){
Aaa m1=new Aaa();
m1.start();
}
}
Output:
1
2
3
4
示例 2:
// Using sleep() method
public class Aaa extends Thread{
public void run(){
for(int i=1;i<5;i++){
try{
Thread.sleep(500); // sleeps thread
} catch(InterruptedException e){
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String[] args){
Aaa m1=new Aaa(); // creating one object
Aaa m2=new Aaa(); // creating second object of a class
m1.start(); // calls run method
m2.start();
}
}
Output:
1
1
2
2
3
3
4
4
最佳答案
您已经创建了两个 Runnable
对象。如果你通过调用它们的 run
方法来运行它们,你会得到你想象的结果:
Aaa m1=new Aaa(); // creating one object
Aaa m2=new Aaa(); // creating second object of a class
System.out.println("Calling m1.run()");
m1.run(); // we call run method
System.out.println("Calling m2.run()");
m2.run();
输出
Calling m1.run()
1
2
3
4
Calling m2.run()
1
2
3
4
因为方法执行了两次,一个接一个。
请注意,调用Runnable/Thread
的run
方法不是运行线程的正常方法。您通常会使用 start
方法。
但是,如果您将每个都放在一个Thread
中并启动
它们:
Aaa m1=new Aaa(); // creating one object
Aaa m2=new Aaa(); // creating second object of a class
System.out.println("Calling m1.start()");
m1.start(); // thread calls run method
System.out.println("Calling m2.start()");
m2.start();
现在每个对象都在自己的线程中并行运行,因此输出是交错的:
Calling m1.start()
Calling m2.start()
1 < From thread 1
1 < From thread 2
2 ...
2
3
3
4
4
顺序显然会因线程交错方式而异。
可能会让您感到困惑的一件事是您选择了extend Thread
。这是气馁。最好是 implement Runnable
- 像这样:
public class Aaa implements Runnable {
public void run() {
for (int i = 1; i < 5; i++) {
try {
Thread.sleep(500); // sleeps thread
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String[] args) {
Aaa m1 = new Aaa(); // creating one object
Thread t1 = new Thread(m1); // Its thread
Aaa m2 = new Aaa(); // creating second object of a class
Thread t2 = new Thread(m2); // Its thread
t1.start(); // calls m's run method in a new thread.
t2.start();
}
}
现在更清楚您的对象在两个不同的线程中运行,因此并行运行。
关于java - sleep() 方法如何在给定线程和输出上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092556/
我是一名优秀的程序员,十分优秀!