Java 具有线程类和可运行接口的输出
这两个程序都使用相同的逻辑实现,即在一个程序中,通过扩展thread类创建线程,另一个通过实现Runnable接口创建线程 这里的输出类似于“打印一些值,直到我按ENTER或RETURN键”,我的问题是,当我运行这两个程序时,“通过扩展线程类创建线程的程序将停止扩展线程类打印值,直到我按ENTER/RETURN键”我们说两者都在使用可运行接口输出创建线程的程序正在停止” 在这里,这两个程序的逻辑是相同的,唯一的区别是一个程序扩展线程类和实现可运行接口不同 通过延长螺纹Java 具有线程类和可运行接口的输出,java,multithreading,runnable,Java,Multithreading,Runnable,这两个程序都使用相同的逻辑实现,即在一个程序中,通过扩展thread类创建线程,另一个通过实现Runnable接口创建线程 这里的输出类似于“打印一些值,直到我按ENTER或RETURN键”,我的问题是,当我运行这两个程序时,“通过扩展线程类创建线程的程序将停止扩展线程类打印值,直到我按ENTER/RETURN键”我们说两者都在使用可运行接口输出创建线程的程序正在停止” 在这里,这两个程序的逻辑是相同的,唯一的区别是一个程序扩展线程类和实现可运行接口不同 通过延长螺纹 import java.i
import java.io.IOException;
class TryThread extends Thread {
public TryThread(String firstName, String secondName, long delay) {
this.firstName = firstName;
this.secondName = secondName;
aWhile = delay;
setDaemon(true);
}
public void run() {
try {
while (true) {
System.out.print(firstName);
Thread.sleep(aWhile);
System.out.print(secondName + "\n");
}
} catch (InterruptedException e) {
System.out.println(firstName + secondName + e);
}
}
private String firstName;
private String secondName;
private long aWhile;
}
public class Lab1 {
public static void main(String[] args) {
Thread first = new TryThread("A ", "a ", 200L);
Thread second = new TryThread("B ", "b ", 300L);
Thread third = new TryThread("C ", "c ", 500L);
System.out.println("Press Enter when you have had enough...\n");
first.start();
second.start();
third.start();
try {
System.in.read();
System.out.println("Enter pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
return;
}
}
输出:
Press Enter when you have had enough...
A B C a
A b
B a
A c
C a
A b
B a
A b
B c
C a
A a
A b
B a
A c
C b
B a
A
Enter pressed...
通过实现可运行接口
import java.io.IOException;
class TryThread1 implements Runnable {
public TryThread1(String firstName, String secondName, long delay) {
this.firstName = firstName;
this.secondName = secondName;
aWhile = delay;
}
public void run() {
try {
while (true) {
System.out.print(firstName);
Thread.sleep(aWhile);
System.out.print(secondName + "\n");
}
} catch (InterruptedException e) {
System.out.println(firstName + secondName + e);
}
}
private String firstName;
private String secondName;
private long aWhile;
}
public class Lab2 {
public static void main(String[] args) {
Thread first = new Thread(new TryThread1("A ", "a ", 200L));
Thread second = new Thread(new TryThread1("B ", "b ", 300L));
Thread third = new Thread(new TryThread1("C ", "c ", 500L));
System.out.println("Press Enter when you have had enough...\n");
first.start();
second.start();
third.start();
try {
System.in.read();
System.out.println("Enter pressed...\n");
} catch (IOException e) {
System.out.println(e);
}
return;
}
}
输出
Press Enter when you have had enough...
A B C a
A b
B a
A c
C a
A b
B a
A b
B c
C a
A a
A b
B a
A c
C b
B a
A a
A b
B c
C a
A
Enter pressed...
b
B a
A a
A b
B c
C a
A b
B a
A c
C a
A b
B a
A b
B a
A c
C a
A b
B a
A c
C b
B a
A a
A b
请告诉我扩展线程和实现可运行接口的区别。
他们中的大多数人更喜欢实现可运行接口。但是从这个输出差异来看,我不知道应该选择哪一个。这个差异似乎是特定于您的代码的。您调用setDaemon(true)--当扩展
线程时
而不是在实现可运行时
。JavaDoc说:当运行的线程都是守护进程线程时,Java虚拟机退出