当前位置: 首页 > 面试题库 >

使用线程奇数打印

夏侯弘量
2023-03-14
问题内容

使用线程进行奇数打印,创建一个线程类,两个线程实例。 一个将打印奇数,而另一个将打印偶数。

我做了以下编码。但这涉及到死锁状态。有人可以解释一下原因吗?

public class NumberPrinter implements Runnable{
private String type;
private static boolean oddTurn=true;


public NumberPrinter(String type){
    this.type=type;
}
public void run() {
    int i=type.equals("odd")?1:2;
    while(i<10){
        if(type.equals("odd"))
            printOdd(i);
        if(type.equals("even"))
            printEven(i);
        i=i+2;
    }

}

private synchronized void printOdd(int i){
    while(!oddTurn){
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println(type + i);
    oddTurn=false;
    notifyAll();
}

private synchronized  void printEven(int i){
    while(oddTurn){
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace(); 
        }
    }
    System.out.println(type + i);
    oddTurn=true;
    notifyAll();

}

public static void main(String[] s){
    Thread odd=new Thread(new NumberPrinter("odd"));
    Thread even=new Thread(new NumberPrinter("even"));
    odd.start();
    even.start();

}
}

输出: 奇数1偶数2

然后陷入僵局!!!!!!

谢谢你的帮助。


问题答案:

您正在等待并通知其他对象( 监视器 )。

这个想法是,你在做和obj.wait()做的obj.notify()时候可以打电话等待一个人做。objA.wait()``objB.notify()

将您的printOdd方法更改为类似

private void printOdd(int i) {
    synchronized (lock) {                        // <-------
        while (!oddTurn) {
            try {
                lock.wait();                     // <-------
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(type + i);
        oddTurn = false;
        lock.notifyAll();                        // <-------
    }
}

printEven方法类似。

然后为提供NumberPrinter一个lock对象:

Object lock = new Object();
Thread odd = new Thread(new NumberPrinter("odd", lock));
Thread even = new Thread(new NumberPrinter("even", lock));

输出:

odd1
even2
odd3
even4
odd5
even6
odd7
even8
odd9


 类似资料:
  • 问题内容: 我正在尝试使用2个不同的线程交替打印奇数和偶数。我能够使用等待,通知和同步块来实现它,但是现在我想评估是否可以不使用等待,通知和同步来实现它。 以下是我拥有的代码,但无法正常工作: } 有任何想法吗? 根据Bruno的建议,我创建了另一个版本,该版本似乎效果更好: 问题答案: 代码未正确同步,这就是问题所在。 您的代码中允许以下执行顺序: 第一个线程看到,将其设置为并进入块。 第二个线

  • 有两个线程,一个是打印偶数,另一个是打印奇数。在下面自定义锁的帮助下,我想按顺序打印数字。问题出在打印一些数字后(显示的数字顺序正确。)线程越来越死机。我花了一个多小时还是找不到问题,对我来说一切都很好。

  • 我试图实现这一点:第一个线程打印1,第二个线程打印2,第三个线程打印3,第一个线程打印4等等: 我做到了这一点,并发挥了作用: 输出是这样的: 它达到了目的,但是如果我有两个线程要打印,那么我必须使用更多的如果条件。 任何人都可以建议以更好的形式编写这段代码,以更干净的方式完成任务,这样如果添加更多线程,它就可以扩展。

  • 我想得到用户输入的所有奇数和偶数,然后得到所有奇数的乘积和偶数的差值。例如:输入一个字符串:dfgi456456=';]=34521。输出应该显示用户输入中的所有奇数和偶数以及乘积和差值,在这种情况下,奇数是:5,3,1偶数是:4,6,2奇数的PRODUCT(乘法答案):15偶数的DIFFERENCE(减法答案):-4。请查看我下面的代码。任何帮助都将不胜感激。谢谢。 }

  • 我试图通过一个向量来调用cook类,但是我不知道该怎么做。这是我的代码: _cooks是一个类的向量,而我试图构建的函数是: 然而,当我尝试编译时,我发现: 厨房。cpp:在成员函数“void Kitchen::make_pizza(标准:_cxx11::string,标准:_cxx11::string,Ipc)”中:厨房/厨房。cpp:148:59:错误:在'void'std::thread t

  • 这个问题是在电子艺术采访中提出的。 有三条线。第一个线程打印1到10个数字。第二个线程打印从11到20的数字。第三条线从21到30。现在这三个线程都在运行。然而,数字是按不规则的顺序打印的,如1、11、2、21、12等。 如果我想让数字按排序顺序打印,比如1,2。。。我该怎么处理这些线呢?