为什么一个线程阻止其他线程运行?

时间:2016-03-13 20:38:17

标签: java multithreading

我打算在我正在制作的游戏引擎中为每个声音使用线程。问题是,每当我创建一个具有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");
        }
    }
}

4 个答案:

答案 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()方法中删除无限循环。