- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下三个类(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/
我是一名优秀的程序员,十分优秀!