2009-09-01 8 views
0

私はスレッド私は新しい文字列を作成していJavaのマルチスレッド同期の問題?

public void run() 
    { 
     while(true) 
     { 
      try { 
       for (int i = 0; i < 100; i++) { 
        buf.append(hello + (myint++)); 
       } 
       buf.append("\n"); 
       adapter.setData(buf.toString()); 
       buf = null; 
       buf = new StringBuffer(); 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
      } 

     } 

を下回っているのrunメソッドを持っている

...それはあまりにもbasic..Please助けとなることがあります...私は同期の問題があると思います各実行中のデータおよびアダプタクラスsetDataメソッドに渡し..

アダプタクラスで私にsetDataはこのようなものです。..

public boolean setData(String sb){ 

     str = sb; 
     if(str != null && !str.equalsIgnoreCase("")){ 
      timer.scheduleAtFixedRate(new TimerTask() { 
       public void run() { 


          System.out.println("inside run....."); 
         System.out.println("str length:- "+str.length()); 
           //do sth after this.. 

           } 
        } 

富栄最初の実行メソッドでbuf.toString()を使って新しい文字列を作成しようとしても、これを取得します。

私は何が間違っているのですか?

ありがとうございます。

答えて

2

これは、strがクラス変数であるためです。

public boolean setData(final String str){ 

     if(str != null && !str.equalsIgnoreCase("")){ 
       timer.scheduleAtFixedRate(new TimerTask() { 
       public void run() { 


          System.out.println("inside run....."); 
           System.out.println("str length:- "+str.length()); 
           //do sth after this.. 

           } 
        } 
0

問題がありますが、これはまったく同期していないことが原因です。たとえば、「str」フィールドはあるスレッドから読み取られており、同時に同期せずに別のスレッドから同時に更新されます。

(。あなたは完全かつ実行可能な例の代わりに、あなたが面白いと思います部分だけを示した場合、それが役立つだろう)

2

何が間違ってやっていることはこれです:bufstrは両方とも明らかにしていますインスタンスまたは複数のスレッドによって非同期にアクセスされる静的フィールド。

local variablesのコンセプトに気付いていないようです。 bufstrの両方がローカル変数(strsbメソッドパラメータで置き換えられている)のように見えます。これにあなたのコードを変更してみてください:

public void run() 
{ 
    while(true) 
    { 
     try { 
      StringBuffer buf = new StringBuffer(); 
      for (int i = 0; i < 100; i++) { 
       buf.append(hello + (myint++)); 
      } 
      buf.append("\n"); 
      adapter.setData(buf.toString()); 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

public boolean setData(String str){ 
    if(str != null && !str.equalsIgnoreCase("")){ 
     timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      System.out.println("inside run....."); 
      System.out.println("str length:- "+str.length()); 
      //do sth after this.. 
     } 
    } 

そしてbufstrのインスタンスまたはクラスの宣言を削除します。メソッドの外側で実際にそれらが必要な場合は、戻り値を使用して試行してください。そうでない場合はsynchronizationを使用してください。

+0

お返事ありがとうございます。下に指し示すように最終的に助けられたstrを宣言します。私は内部クラスでそれを必要とします –

+1

それは助けた「最終的な」ではありません!それはそれをローカル変数に変更しています。 –

0

はのsyncronizationオブジェクトを使用して同期されます "STR" のためのgetおよびsetメソッドを使用してみてください:

private static Object syncObject = new Object(); 
public String getStr(){ 
    synchronized (syncObject){ 
    return str; 
    } 
} 
public void setStr(String value){ 
    synchronized (syncObject){ 
    str = value; 
    } 
} 

そしてinsted:

str=sb; 

を試してみてください。

setStr(sb); 

insted:

System.out.println("str length:- "+str.length()); 

try:System.out.println("str length:- "+getStr().length());