【问题标题】:Thread wait() affects the Main thread ? [duplicate]线程 wait() 影响主线程? [复制]
【发布时间】:2015-12-15 15:16:01
【问题描述】:

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

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 , goint 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 在等待的情况下进入睡眠状态,然后让Thread2 使用 notify() 唤醒 Thread1 ,但他没有机会。

为什么 Thread1 的 wait() 会影响主线程执行 t2.run();

【问题讨论】:

  • 请查一下run()和start()的区别
  • Thread 成为 Runnable 一定是 Java API 中最愚蠢的事情之一。
  • @MarkoTopolnik:我的线程没有实现 Runnable 。
  • 我建议你再检查一次:) 这是不可能的。顺便说一句,这不是你的错,而是 JDK 的错。
  • package java.lang; public class Thread implements Runnable { ... }.

标签: java multithreading mutex thread-synchronization


【解决方案1】:

您不得尝试使用 run() 方法启动线程。它实际上并没有创建一个新线程,它运行当前线程中的代码。请改用 thread.start() 以使您的代码在单独的(新)线程中执行

【讨论】:

  • 正确的想法,但是“应该”听起来像是调用者可以选择,但实际上并没有这样的选择。启动线程的唯一方法是调用t.start()
  • 感谢您的评论,我已更新我的答案以使其更加清晰。
【解决方案2】:

这是错误的:

Thread2 t2 = new Thread2();
Thread1 t1 = new Thread1();
t1.run();
t2.run();

改成这样:

Thread2 t2 = new Thread2();
Thread1 t1 = new Thread1();
t1.start();
t2.start();

【讨论】:

  • 你的第一个 sn-p 没有错误 不是本身。只有当它没有按照程序员的意图去做时,它才是错误的。您的回答没有说​​明程序员的意图。您的答案没有说明 为什么 第一个示例是错误的或为什么第二个示例是正确的。当你可以教他如何钓鱼时,你在这里所做的只是向菜鸟扔鱼。
  • 好的。创建一个 Thread 对象(而不是 Runnable)然后调用 run() 是否正确?我想不出任何需要的情况。希望读者看到sn-ps这两种代码的不同之处,并查阅这两种方法的文档了解其余部分。
  • “正确”就像好的设计一样?我无法想象调用t.run() 会如何改进程序的设计,但我可以想象它是修复错误的廉价、低俗黑客的一部分。我见过更糟糕的。呵!我可能承诺更糟,在商业产品中也是如此。至于你的希望,不要担心。 Antonis_wrx 已经为菜鸟提供了他需要的信息。
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多