如何在两个线程之间共享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"
这里'thread'对象是在ThreadMainClass类中全局创建的:
public static Scanner scan = new Scanner(System.in);
两个线程都在访问它。我的要求是:我想在Thread1中显示从Thread2传递的“ABCD”。它显示如果我放一些延迟,以便在Thread1中的行之前创建Scanner对象:
str = System1Class.scan.nextLine();
但我不想让两个人使用任何延迟。那么我有什么方法可以做?我希望在从Thread2传递的那一刻显示“ABCD”。同时,Thread1应该从控制台等待数据,即Thread1不应该等待来自Thread2的任何通知。如果从Thread2传递数据,只需获取它并打印它,否则它应该只从控制台等待。
我想我需要一种方法来刷新Thread2中的'scan'对象,但我不确定。 :)
提前致谢
答案 0 :(得分:0)
要显示它传递的同一个实例,您需要在类中调用一个方法,将AtomicBoolean
变量设置为true
。您将不得不编写一个循环并检查该变量的真值的方法。如果是true
,则立即打印。
还要确保您synchronize
读写线程
您也可以通过在Java中创建自己的事件
来完成此操作从本教程中阅读有关此方法的所有内容:
答案 1 :(得分:0)
您可以使用wait()和notify()方法同步2个线程。
在全球课上:
Object wh = new Object();
在thread1的代码中:
while(true)
{
//Thread.currentThread().sleep(5000); // if I used this it is printing ABCD
//Wait thread2 to notify
// Prevent IllegalMonitorStateException occurs
synchronized(wh) {
wh.wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
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"
//Notify thread1
// Prevent IllegalMonitorStateException occurs
synchronized(wh) {
wh.notify();
}catch (InterruptedException e) {
e.printStackTrace();
}
HTH。