在两个线程之间共享扫描程序

时间:2012-10-25 11:44:20

标签: java

如何在两个线程之间共享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'对象,但我不确定。 :)

提前致谢

2 个答案:

答案 0 :(得分:0)

要显示它传递的同一个实例,您需要在类中调用一个方法,将AtomicBoolean变量设置为true。您将不得不编写一个循环并检查该变量的真值的方法。如果是true,则立即打印。

还要确保您synchronize读写线程

您也可以通过在Java中创建自己的事件

来完成此操作

从本教程中阅读有关此方法的所有内容:

How to create your own events in 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。