Thread wait()会影响主线程吗?

13 浏览
0 Comments

Thread wait()会影响主线程吗?

考虑以下这个简单的多线程示例:

public class LetsMutexThreads {
    public static Object MUTEX = new Object();
    
    private static class Thread1 extends Thread {
        public void run() {
            synchronized (MUTEX) {
                System.out.println("I'm thread 1, going to take a nap...");
                try {
                    MUTEX.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("T1: That's it, I'm done...");
            }
        }
    }
    
    private static class Thread2 extends Thread {
        public void run() {
            synchronized (MUTEX) {
                System.out.println("Thread 2: Let's rock N roll!");
                System.out.println("Waking up my buddy T1...");
                MUTEX.notify();
            }
        }
    }
    
    public static void main(String[] args) {
        Thread2 t2 = new Thread2();
        Thread1 t1 = new Thread1();
        t1.run();
        t2.run();
    }
}

我试图让`Thread1`通过`wait()`进入睡眠状态,然后让`Thread2`使用`notify()`唤醒`Thread1`,但它没有机会执行。为什么`Thread1`的`wait()`影响主线程执行`t2.run()`?

0
0 Comments

从上述内容中可以整理出问题的原因是在第一个代码片段中,线程t1和t2都是通过调用run()方法来执行的,而不是通过调用start()方法来启动线程。由于没有调用start()方法,线程t1和t2都是在主线程中运行,而不是在新的线程中运行。这导致了线程t1和t2的执行顺序与预期不符。

解决方法是在第二个代码片段中,通过调用start()方法来启动线程t1和t2。调用start()方法会创建一个新的线程,并在新的线程中执行run()方法。这样,线程t1和t2就会在独立的线程中并行执行,而不是在主线程中顺序执行。

以下是整理的文章:

在编写多线程程序时,我们需要注意线程的启动方式。如果我们希望在程序中创建并行执行的线程,而不是在主线程中顺序执行,那么我们应该使用start()方法来启动线程,而不是直接调用run()方法。

在上述代码中,第一个代码片段中的线程t1和t2都是通过调用run()方法来执行的,而没有调用start()方法来启动线程。这导致了线程t1和t2的执行顺序与预期不符。实际上,由于没有调用start()方法,线程t1和t2都是在主线程中运行,而不是在新的线程中运行。这就是为什么第一个代码片段是错误的。

为了解决这个问题,我们需要在第二个代码片段中调用start()方法来启动线程t1和t2。调用start()方法会创建一个新的线程,并在新的线程中执行run()方法。这样,线程t1和t2就会在独立的线程中并行执行,而不是在主线程中顺序执行。通过这种方式,我们可以实现并行执行的效果,使得程序能够更高效地运行。

总结起来,正确使用start()方法来启动线程是编写多线程程序的关键。通过调用start()方法,我们可以创建并行执行的线程,从而提高程序的效率。而直接调用run()方法则会导致线程在主线程中顺序执行,无法实现并行执行的效果。因此,在编写多线程程序时,我们应该注意使用正确的线程启动方式,以确保程序能够按照我们的预期进行执行。

0
0 Comments

当我们想要在程序中创建一个新的线程时,应该使用thread.start()方法而不是run()方法。因为run()方法实际上并不会创建一个新的线程,它只是在当前线程中执行代码。只有调用thread.start()方法,才能在一个单独的新线程中执行代码。

这里出现问题的原因是有人错误地使用了run()方法来启动线程,导致代码在主线程中执行而不是在新线程中执行。这可能会导致问题,因为如果在主线程中执行耗时的操作,会阻塞主线程的执行,使程序变得不响应。

解决这个问题的方法很简单,只需要将错误的run()方法调用改为正确的thread.start()方法调用即可。这样代码就会在一个新线程中执行,不会影响主线程的执行。

感谢评论者的指正,我已经更新了我的答案,以使其更清晰明了。

0