gpt4 book ai didi

java - 为什么第二次创建同一个线程时 BufferedReader.ready() 不起作用?

转载 作者:行者123 更新时间:2023-12-02 12:34:14 24 4
gpt4 key购买 nike

我有以下三个类(class):

第 1 类:

public class System1Class {

public static void main(String args[]) throws IOException {

while(true) // Every 5 seconds it will create below two new threads.
{
System.out.println("New threads created.");
Thread sndThreadSys1 = new Thread(new SendThreadSys1(), "SendThreadSys1");
Thread rcvThreadSys1 = new Thread(new ReceivedThreadSys1(), "ReceivedThreadSys1");

sndThreadSys1.start();
rcvThreadSys1.start();

try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}

第 2 类:

public class SendThreadSys1 implements Runnable{

public void run() {

try {
Thread.currentThread().sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String st = "BYE";
InputStream is = new ByteArrayInputStream(st.getBytes());
System.setIn(is);
ReceivedThreadSys1.br = new BufferedReader(new InputStreamReader(System.in)); // refresh the br object

}

}

第 3 类:

public class ReceivedThreadSys1 implements Runnable{

public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public void run() {

try{
while(true)
{
while(!br.ready()) // waiting for input from console/Std i/p Stream
{
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String s = br.readLine();
System.out.println("Print :::"+s);
if(s.equals("BYE"))
{
break;
}
}

System.out.println("I am outside.");
}
catch(IOException e)
{
e.printStackTrace();
}
}
}

First 类是创建线程的主类,它每 5 秒创建两个新线程。

第一个线程 (SendThreadSys1) 将在第二个线程 (ReceivedThreadSys1) 启动后每隔 4 秒将字符串“BYE”发送到标准 i/p 流来停止第二个线程 (ReceivedThreadSys1)。在前 4 秒内,我可以从控制台输入内容,并且字符串会打印在控制台中。但是在主类中第二次创建新线程后(即 5 秒后),该程序未检测到来自控制台的任何输入。

第二次没有检测到控制台的任何输入可能是什么原因?

最佳答案

我尝试了您发布的代码,它似乎有效。但是,我确实注意到一个可能的多线程问题,该问题可能会影响它是否始终在所有系统上运行,因此可能就是问题所在。

在您的 SendThreadSys1 代码中,您有:

ReceivedThreadSys1.br = 
new BufferedReader(new InputStreamReader(System.in));

它只是写入一个将在另一个线程中使用的变量。一个线程完成的写入不会自动可供另一线程中的读取。我看不到任何明显的东西可以确保当另一个线程中的 run 方法读取引用的 br 写入时可见。

如果您有一个可以重现该问题的系统,我建议将 br 设为 ReceivedThreadSys1 私有(private),并且仅通过静态同步 get 和 set 方法更新和访问它,即使在 ReceivedThreadSys1 中也是如此。

顺便说一句,它应该只是Thread.sleep(5000)等。Thread.sleep是一个静态方法,只能 hibernate 调用线程。

关于java - 为什么第二次创建同一个线程时 BufferedReader.ready() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155279/

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