我打算在我正在制作的游戏引擎中为每个声音使用线程。问题是,每当我创建一个具有while(true)
语句的新线程时,另一个线程就会停止运行。
我做了一个班来测试这个,它只打印"再见"而不是"你好"。我想知道如何让两个线程同时运行。
public class testor {
public static void main(String args[]){
testor test=new testor();
test.runTest();
}
class threadTest implements Runnable{
@Override
public void run() {
while(true){
System.out.println("goodbye");
}
}
}
public void runTest(){
threadTest test=new threadTest();
test.run();
while(true){
System.out.println("hello");
}
}
}
答案 0 :(得分:2)
由于您正在执行test.run();
,您只是调用该类的方法但不启动该线程。
所以为了回答你的问题:没有这样的 线程阻止其他线程运行? 因为你只有 正在循环的线程并打印消息System.out.println("goodbye");
如果该方法永远不会循环,它将返回runTest
方法,然后您会看到System.out.println("hello");
要启动Thread
,请使用Thread::start方法,而不是run
。
答案 1 :(得分:2)
使用(new ThreadTest()).run()
不会启动新的Thread
,而只是调用当前线程中的run()
方法。
要在单独的线程中运行代码,请执行以下操作:
(new Thread(new ThreadTest())).start();
答案 2 :(得分:2)
那是因为您没有创建新主题。只需命名一个包含" thread"的类。不会使它成为一个线程,并且Thread
不是线程 - 它是一个类似于任何其他类的类,没有特殊的语义或行为。
唯一的特殊之处在于,您可以将其传递给public class Testor {
public static void main(String args[]){
Testor test=new Testor();
test.runTest();
}
class MyRunnable implements Runnable{
@Override
public void run() {
while(true){
System.out.println("goodbye");
}
}
}
public void runTest(){
Thread testThread = new Thread(new MyRunnable());
testThread.start();
while(true){
System.out.println("hello");
}
}
}
执行。
arr=np.array(arr, dtype=[('O', np.float)]).astype(np.float)
如果您不希望代码在与大多数其他现有Java代码结合使用时看起来像外星人,那么您应该遵守关于类和变量名的Java编码标准。
此外,多线程不仅仅是能够启动新线程。您还应该阅读有关同步问题的信息 - 正确执行比您想象的更复杂。
答案 3 :(得分:-1)
您的run
方法包含无限循环。
runTest()
方法创建线程,这意味着您将拥有2个执行堆栈,主堆栈和可运行的threadTest
堆栈。
因为你首先运行包含无限循环的线程方法,所以你总是得到输出"good Bye"
。
从run()
方法中删除无限循环。