使用线程进行奇数打印,创建一个线程类,两个线程实例。 一个将打印奇数,而另一个将打印偶数。
我做了以下编码。但这涉及到死锁状态。有人可以解释一下原因吗?
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。。。我该怎么处理这些线呢?