2012-02-15 14 views
1

我们假设在一个类中有三个方法如下,我需要一个接一个地调用每个方法,但由于每个方法都在单独的线程上运行,所以请告诉我一个方法来调用每个下列方法,如何在java中使用Thread

..... 
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 **/**异常**吗? – 2012-02-15 08:17:34

回答

2

您可以使用方法

new Thread().join(); 

,等待前一个线程死亡。 然后调用下一个方法。

你的错误意味着某个线程修改你的List对象,而另一个线程同时迭代它。因此,当列表更改其内容时,线程无法遍历该列表。你应该使用​​块码,一些事情,如:

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

    } 
} 
3

如果你需要打电话给他们“一个又一个的一个”,为什么你需要单独的线程?他们不能在同一个人(主)中跑全部?

+0

我对每种方法的单独任务进度条,这是我必须使用独立的线程的情况下。 – Harsha 2012-02-15 08:24:11

0

还有的被访问,并从不同的线程修改LinkedList一个实例。

快速修复是为列表添加私有setter和getters,将它们标记为​​并仅使用这些同步方法访问列表。

+1

这不会帮助,代码列表,在一个线程迭代和修改的列表(我想去除列表中的元素)的另一种。最好的解决方案是使用Concurrent支持列表,但我相信他必须首先阐明他的需求。 – 2012-02-15 08:31:08

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,并且你也需要同步你的线程,这样任何时候都不会有两个线程修改同一个集合对象。

注意Iterator.remove是在迭代修改集合的唯一安全的方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为是未指定的。

+0

很明显,这是一个错字!看看堆栈跟踪。 – 2012-02-15 08:29:27

+0

@AmirPashazadeh:做检查答案就太那个,评论一半众所周知的事情了。 – 2012-02-15 08:30:44

1

在编码之前,每个人都应该清楚他/她的需求!只要清楚你自己的需求是什么?你需要顺序执行还是并发执行? 之后,根据您的需要查看您拥有的工具。 如果您需要的并发访问,就看java.util.concurrent包。有很好的课程可以帮助你。

相关问题