gpt4 book ai didi

java - 使用两个线程打印偶数和奇数

转载 作者:行者123 更新时间:2023-11-29 07:33:28 26 4
gpt4 key购买 nike

我尝试使用等待和通知通过两个线程重复打印偶数和奇数。但是,我已经完成了网站上给出的所有实现。虽然作为第一次多线程开发人员,我试图自己做,但我无法得到想要的结果。我在下面粘贴我的代码:请您查看并回复我犯错的更正和解释。

package com.test.printEvenOdd;

public class PrintOddEvenNumbers {

public static void main(String[] args){

String s = new String("");

EvenThread t1= new EvenThread(s);
OddThread t2= new OddThread(s);
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
th1.start();
th2.start();
}

}

class EvenThread implements Runnable{
String s;
EvenThread(String s){
this.s= s;
}

@Override
public void run() {
synchronized(s){
for(int i=1;i<=10;i++){

if(i%2==0){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i);
s.notify();
}
try {
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}

}

class OddThread implements Runnable{

String s;
OddThread(String s){
this.s= s;
}

@Override
public void run() {
synchronized(s){
for(int i=1;i<=10;i++){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(i%2==1){
System.out.println(i);
s.notify();
}
try {
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}

最佳答案

你的问题是你锁定保守/限制:

您将锁锁定在整个 循环中;对于两个线程。

因此,一个线程进入其循环;但很快就无法进展。因为它需要其他线程才能进行。但是第二个线程甚至无法启动 - 因为它根本无法进入循环!

换句话说:为了进步;两个线程都需要能够进入各自的循环;并取得足够的进展,以便另一个线程可以执行下一步。

这就像 build 一个只有两个人才能一起出去的房间;但是你只允许一个人进入那个房间。

欢迎使用多线程编程;您刚刚创建了第一个死锁

记录在案:重新安排锁时;确保你得到正确的信号;这样等待/通知就可以按预期工作。

最后:如果你仔细看你的代码;你会发现你重复了很多代码。这总是一个坏主意。相反:尝试找出哪些部分真正不同;和其他任何东西......应该在你的源代码中恰好存在一次。因此,作为另一个练习:当您重新安排代码以使其执行预期的操作时 - 尝试重构它,以便将代码重复量降至最低。我向您保证,这将是一项值得您花时间去做的练习!

关于java - 使用两个线程打印偶数和奇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com