【问题标题】:How to stop Thread Intercommunication? [closed]如何停止线程互通? [关闭]
【发布时间】:2015-12-19 16:42:59
【问题描述】:

JAVA 线程初学者,我有两个线程都从 1 数到 20 并且一个线程正在打印甚至没有。其他线程正在打印奇数。一个接一个地同时像奇数1偶数2奇数3偶数4...奇数17偶数-18奇数19使用线程间通信(在同一实例上使用等待和通知方法)。

这部分执行得很好。但在计数结束时,任何一个线程都处于等待状态,而其他线程正在终止。

那么如何摆脱这个问题呢?我应该使用什么方法来解决这个问题?

代码:

public class OddEvenNumbers {

    static A a= new A();
    public static void main(String[] args) {


        OddNumbers odd = new OddNumbers();
        EvenNumbers even = new EvenNumbers();

        Thread th1 = new Thread(odd);
        Thread th2 = new Thread(even);
        th1.start();

        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        th2.start();
    }
}

public class EvenNumbers implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub

        for(int i=1;i<20;i++)
        {
            synchronized (OddEvenNumbers.a) {
                if(i%2==0)
                {
                    System.out.println("Even Numbers : "+i);

                }
                try {

                    OddEvenNumbers.a.notify();
                    OddEvenNumbers.a.wait();

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }
    }

}



public class OddNumbers implements Runnable {


    public void run() {

        System.out.println("In ODD run Method"); 


        for(int i=1;i<20;i++)
        {
            synchronized (OddEvenNumbers.a) {

                if(i%2!=0)
                {
                    System.out.println("ODD Number "+i);

                }
                try {

                    OddEvenNumbers.a.wait();
                    OddEvenNumbers.a.notify();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }

    }

}

【问题讨论】:

  • 你能分享你的代码吗?
  • 如果两个线程中的一个总是在等待另一个线程,那么使用不同的线程是没有意义的。你只是在同步上浪费了很多时间。如果您遇到确实允许并行处理的问题,也许使用ExecutorService 会有所帮助。
  • @fabian,这是一个非常常见的家庭作业。你是对的,在真正的程序中这样做是一件愚蠢的事情,但它教会了他们同步线程的基础知识。
  • 感谢您的 cmets。但这是我为理解等待和通知概念所做的一个简单示例。

标签: java multithreading thread-safety


【解决方案1】:

移除最后一个 wait() 调用(当计数器等于 20 时),这样最后一个打印线程将不会等待而没有机会获得 notify()。

【讨论】:

  • 它帮助我解决了这个问题。但是处理等待和通知是正确的方法还是我们需要一些其他方法或预定义的类
  • 我认为对于这个简单的任务,这是合适的简单方法 - 还有一些其他工具(例如信号量),但它们可能有点太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2020-05-29
相关资源
最近更新 更多