2012-10-25 49 views
1

如何在兩個線程之間共享Scanner對象,以便我可以在一個線程中將值傳遞給標準I/P流並顯示在另一個線程中?在兩個線程之間共享掃描器

我已經創建如下兩個線程:

線程1我用下面的代碼:

while(true) 
{ 

//Thread.currentThread().sleep(5000); // if I used this it is printing ABCD 
str = System1Class.scan.nextLine(); 
System.out.println(str); 
} 

線程2我使用下面的代碼:

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」。它顯示的是如果我把一些延遲,使掃描對象將前行的線程1創建:

str = System1Class.scan.nextLine(); 

但是,我不想要兩個使用任何延遲。那麼我有什麼辦法可以做?我想在從Thread2傳遞的那一刻顯示「ABCD」。同時,Thread1應該等待來自控制檯的數據,即Thread1不應該等待來自Thread2的任何通知。如果從Thread2傳遞數據,只需獲取它並打印它,否則它應該只從控制檯等待。

我想我需要一種方法來刷新Thread2中的'掃描'對象,但我不確定。 :)

在此先感謝

+0

您可以通過使用ManualResetEvent的同步2個線程,線程2將通知線程1時,線程2已經讀出的值到掃描儀實現這一目標。 – Thinhbk

+0

@Thinhbk這是否意味着Thread1將等待來自Thread2的通知?我想要的是我不想等待來自Thread2的通知。 Thread1應該獨立地等待來自控制檯的輸入。它也應該能夠在任何時刻從Thread2獲取值。 – Angom

回答

0

要顯示它的通過相同的實例,則需要調用一個方法,設置一個AtomicBoolean變量true類。你將不得不編寫一個循環並檢查變量真值的方法。如果它的true,然後立即打印。

另外,還要確保你synchronize荷蘭國際集團的讀取和寫入線程

您還可以通過做到這一點在Java中創建自己的事件

閱讀所有關於本教程這個方法:

How to create your own events in Java

+0

我已更新我的帖子,請檢查使用AtomicBoolean是否仍然適用。謝謝。 – Angom

0

您可以通過使用等待()同步2個線程和notify()方法。

在全局類:

Object wh = new Object(); 

在線程1的代碼:

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); 
} 

中的線程2代碼:

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。

+0

如果我使用上面的同步,那麼我將等待與使用sleep(5000)幾乎相似的Thread2。這不是我想要的。每當有控制檯輸入或每當「線程2」傳遞「ABCD」時,我都希望爲str分配值(在Thread1中)。 – Angom

+0

@Angom:這裏的方法是使用睡眠(5000),「原因使用睡眠(5000)將不保證該字符串值將從線程2被傳遞到線程1完全不同的,因爲有執行路徑,其中線程1獲得Scan2對象在thread2之前初始化Scanner對象。請參閱http://java67.blogspot.com/2012/08/what-are-difference-between-wait-and.html – Thinhbk