【发布时间】:2012-10-25 11:44:19
【问题描述】:
如何在两个线程之间共享 Scanner 对象,以便在一个线程中将值传递给标准 i/p 流并在另一个线程中显示?
我创建了如下两个线程:
在 Thread1 我使用了以下代码:
while(true)
{
//Thread.currentThread().sleep(5000); // if I used this it is printing ABCD
str = System1Class.scan.nextLine();
System.out.println(str);
}
在 Thread2 我使用下面的代码:
String st = "ABCD";
InputStream is = new ByteArrayInputStream(st.getBytes());
System.setIn(is);
ThreadMainClass.scan = new Scanner(System.in); // here I am trying to refresh the global object "scan"
这里的 'scan' 对象是在 ThreadMainClass 类中全局创建的:
public static Scanner scan = new Scanner(System.in);
两个线程都在访问它。我的要求是:我想在从 Thread2 传递的 Thread1 中显示“ABCD”。它正在显示如果我放了一些延迟,以便在 Thread1 中的行之前创建 Scanner 对象:
str = System1Class.scan.nextLine();
但我不希望两个使用任何延迟。那么我有什么办法吗?我想在从 Thread2 传递的那一刻显示“ABCD”。与此同时,Thread1 应该等待来自控制台的数据,即 Thread1 不应该等待来自 Thread2 的任何通知。如果数据是从 Thread2 传递的,只需获取它并打印它,否则它应该只从控制台等待。
我想我需要一种方法来刷新 Thread2 中的“扫描”对象,但我不确定。 :)
提前致谢
【问题讨论】:
-
您可以通过ManualResetEvent同步2个线程来实现,当thread2已经将值读入scanner时,thread2会通知thread1。
-
@Thinhbk 这是否意味着 Thread1 将等待来自 Thread2 的通知?我想要的是我不想等待来自 Thread2 的通知。 Thread1 应该独立工作,等待来自控制台的输入。它还应该能够随时从 Thread2 获取值。
标签: java