使用两个不同的线程打印偶数和奇数

时间:2018-11-28 16:14:53

标签: java multithreading

我正在尝试运行此代码,但是卡住了。我不想使用可运行的方法。只是想知道我在这里做错了。

package com.learning.threads;

public class OddThread extends Thread {

    private Integer count;
    Object lock;

    public OddThread(Integer count,Object lock) {
        this.count = count;
        this.lock=lock;
    }

    @Override
    public void run() {

        while (count<1000) {
            synchronized (lock) {
                System.out.println("sdsd"+(count.intValue() % 2));
                if ((count.intValue() % 2) == 0) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else {
                    System.out.println("printing the odd number" + count);
                    count++;
                    lock.notify();
                }

            }

        }
    }
}


package com.learning.threads;

public class EvenThread extends Thread {


    private Integer count;

    Object lock;

    public EvenThread(Integer count,Object lock){
        this.count=count;
        this.lock=lock;
    }

    public void run(){

        while(count < 1000){
             synchronized (lock) {
                 System.out.println((count.intValue()%2));
                if((count.intValue()%2)!=0){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                }else{
                    System.out.println("printing the even number"+ ++count);

                    lock.notify();
                }

            }


        }

    }

}
public class ThreadClass {

    public static void main(String[] args) {


        Integer count=new Integer(1);

        Object lock=new Object();

        EvenThread even=new EvenThread(count,lock);

        OddThread odd=new OddThread(count,lock);

        odd.start();
        even.start();


    }

1 个答案:

答案 0 :(得分:0)

似乎是一种奇怪的方式。学校作业?

无论如何,所以我认为我知道您在尝试什么,但是使用通知来回切换,但是我认为它不会像您期望的那样工作。

您正在调用wait并通知该锁,但是您仍处于同步块中。一次只能在该块中有一个线程。您需要将其从该块中删除,然后尝试通知另一个人。这意味着需要重做一些代码以退出,然后在同步块之外尝试等待/通知代码。关于如何执行可能适合您的增量。