Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止线程交互?_Java_Multithreading_Thread Safety - Fatal编程技术网

Java 如何停止线程交互?

Java 如何停止线程交互?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,JAVA线程初学者,我有两个线程都在从1到20计数,一个线程在打印偶数。另一个线程在打印奇数。一个接一个并发地像奇数-1偶数-2奇数-3偶数-4。。。奇数-17偶数-18奇数-19使用线程间通信(在同一实例上使用wait和notify方法) 这部分执行得很好。但在计数结束时,其中一个线程处于等待状态,另一个线程被终止 那么如何解决这个问题呢?我应该用什么样的方法来解决这个问题 代码: public class OddEvenNumbers { static A a= new A();

JAVA线程初学者,我有两个线程都在从1到20计数,一个线程在打印偶数。另一个线程在打印奇数。一个接一个并发地像奇数-1偶数-2奇数-3偶数-4。。。奇数-17偶数-18奇数-19使用线程间通信(在同一实例上使用wait和notify方法)

这部分执行得很好。但在计数结束时,其中一个线程处于等待状态,另一个线程被终止

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

代码:

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();
                }

            }
        }

    }

}
公共类编号{
静态A=新A();
公共静态void main(字符串[]args){
OddNumbers奇数=新的OddNumbers();
偶数=新的偶数();
螺纹th1=新螺纹(奇数);
螺纹th2=新螺纹(偶数);
th1.start();
试一试{
睡眠(1);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
th2.start();
}
}
公共类实现可运行{
@凌驾
公开募捐{
//TODO自动生成的方法存根

对于(int i=1;i删除最后一个wait()调用(当计数器等于20时),这样,最后一个打印线程就不会等待而没有机会得到notify().

你能分享你的代码吗?如果两个线程中的一个总是在等待另一个线程,那么使用不同的线程是没有意义的。你只是在同步上浪费了很多时间。如果你遇到了允许并行处理的问题,也许使用a会有所帮助。@fabian,这是一个非常常见的家庭作业练习。你是对的,它会在一个真实的程序中做这件事是很愚蠢的,但它教会了他们同步线程的基本知识。谢谢你的评论。但这是一个简单的例子,我这样做是为了理解等待和通知的概念。它帮助我解决了问题。但是处理等待和通知是正确的方法,还是我们需要其他方法或预定义的类想一想,对于这个简单的任务,这是一个合适的简单方法——还有一些其他的工具(例如信号量),但是它们可能有点太多了。