2012-02-15 16 views
1

クラス内に次の3つのメソッドがあり、それぞれのメソッドを次々と呼び出す必要があるとしましょう。各メソッドが別のスレッドで実行されているときにエラーが発生する場合は、以下の各方法を呼び出す方法、スレッドをJavaで使用する

..... 
methodOne(); 
methodTwo(); 
methodTree(); 
..... 

public Class Test{ 

public void methodOne(){ 

    new Thread(new Runnable(){ 
     @Override 
      public void run() { 
      ..... 
     } 
    }).start(); 

} 

public void methodTwo(){ 

    new Thread(new Runnable(){ 
     @Override 
      public void run() { 
      ..... 
     } 
    }).start(); 

} 


public void methodThree(){ 

    new Thread(new Runnable(){ 
     @Override 
      public void run() { 
      ..... 
     } 
    }).start(); 

} 

} 

は、私はあなたが「別の後に一つの」それらを呼び出す必要がある場合は、なぜあなたは別のスレッドを必要としない、次のエラー

java.util.ConcurrentModificationException 
     at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:778) 
     at java.util.LinkedList$ListItr.next(LinkedList.java:713) 
     at Manufacturing.MonthEnd.FinishMonth.fillPreviousMonthBalanceRec(FinishMonth.java:141) 
     at Manufacturing.MonthEnd.FinishMonth.closeMonth(FinishMonth.java:52) 
     at Manufacturing.MonthControllerView.btnCloseMonthActionPerformed(MonthControllerView.java:588) 
     at Manufacturing.MonthControllerView.access$400(MonthControllerView.java:28) 
     at Manufacturing.MonthControllerView$6.actionPerformed(MonthControllerView.java:465) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) 
     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
     at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) 
     at java.awt.Component.processMouseEvent(Component.java:6203) 
     at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
     at java.awt.Component.processEvent(Component.java:5968) 
     at java.awt.Container.processEvent(Container.java:2105) 
     at java.awt.Component.dispatchEventImpl(Component.java:4564) 
     at java.awt.Container.dispatchEventImpl(Container.java:2163) 
     at java.awt.Component.dispatchEvent(Component.java:4390) 
     at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461) 
     at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125) 
     at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055) 
     at java.awt.Container.dispatchEventImpl(Container.java:2149) 
     at java.awt.Window.dispatchEventImpl(Window.java:2478) 
     at java.awt.Component.dispatchEvent(Component.java:4390) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) 
     at java.awt.EventQueue.access$000(EventQueue.java:96) 
     at java.awt.EventQueue$1.run(EventQueue.java:608) 
     at java.awt.EventQueue$1.run(EventQueue.java:606) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
     at java.awt.EventQueue$2.run(EventQueue.java:622) 
     at java.awt.EventQueue$2.run(EventQueue.java:620) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 
+2

どのようなエラーが表示されますか?あなたの質問に** stacktrace **/**例外**を投稿できますか? –

答えて

2

あなたは方法

new Thread().join(); 

を使用して、死ぬ前のスレッドを待つことができます。 次に、次のメソッドを呼び出します。

エラーは、あるスレッドがListオブジェクトを変更し、別のスレッドが同時にそれを反復していることを意味します。したがって、リストの内容が変更されたスレッドは、このリストを反復することはできません。アクセスと異なるスレッドから変更されているLinkedListのインスタンスがあります

List listeners; 
... 
synchronized(listeners){ 
    for(Object o : listeners){ 

    } 
} 
3

を取得しますか?彼らは同じもの(メイン)ですべてを動かすことはできませんか?

+0

私は、それぞれのメソッドのタスクのための別々のプログレスバーを持っています。 – Harsha

0

:あなたは次のようにいくつかのこと、​​ブロックコードを使用する必要があります。

クイックフィックスは、リストのプライベートセッターとゲッターを追加し、​​とマークし、これらの同期メソッドのみを使用してリストにアクセスすることです。

+1

これは役に立ちません。コードはあるスレッドのリストで繰り返し実行され、リストを変更しています(リストから要素を削除すると思います)。最高の解決策は、同時サポートリストを使用することですが、彼はまず彼のニーズを明確にしなければならないと思います。 –

1

これは正常に動作していることをテストします。投稿スタックトレースについては

public class ThreadTest 
{ 
    public static void main(String... args) 
    { 
     Test t = new Test(); 
     t.methodOne(); 
     t.methodTwo(); 
     t.methodThree(); 
    } 
} 

class Test 
{ 

    public void methodOne() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("I AM A THREAD FROM METHOD ONE."); 
      } 
     }).start(); 
    } 

    public void methodTwo() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("I AM A THREAD FROM METHOD TWO."); 
      } 
     }).start(); 
    } 


    public void methodThree() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       System.out.println("I AM A THREAD FROM METHOD THREE."); 
      } 
     }).start(); 
    } 

} 

は、このエラーは、コレクションを反復処理しようとしていると同時に、あなたはそれが値を変更しますしようとするとしています。値を変更するには、常にIteratorを使用し、同時にスレッドを同期させる必要があります。そのため、2つのスレッドが同時に同じコレクションオブジェクトを変更することはありません。

Iterator.removeは、反復処理中にコレクションを変更する唯一の安全な方法です。反復処理の進行中に基になるコレクションが他の方法で変更された場合の動作は不特定です。

+0

それはタイプミスであることは明らかです!スタックトレースを見てください。 –

+0

@AmirPashazadeh:既知のものの半分にコメントする前に、その点についても答えをチェックしてください。 –

1

誰もが自分のニーズをクリアするはずです!あなたの必要は何ですか?シーケンシャルまたは同時実行が必要ですか? その後、必要に応じてあなたが持っているツールを見てください。 同時アクセスが必要な場合は、java.util.concurrentパッケージを参照してください。そのパッケージであなたを助ける良いクラスがあります。