Java Swing - 如何同步ArrayLists

时间:2014-11-27 22:11:20

标签: java swing arraylist synchronized

我正试图在两个不同的线程中执行单个列表。最初,我使用的是for循环,如下所示:

for (int i = 0; i<fighterList.size(); i++) {
    if (fighterList.get(i).isDestroyed() == true) fighterList.remove(i);
}

但我得知,我必须同步线程。我不太明白如何做到这一点,更重要的是它是如何工作的。到目前为止,我所咨询的资源似乎指出了两种不同的方法:

synchronized(fighterList) {
    for (Object o : fighterList) {
        o.doSomeMethod();
    }
}

Iterator<Fighter> iterator = fighter.iterator(); 
while (iterator.hasNext())
    if (iterator.next().returnSomething() == false) iterator.next().doSomeMethod();
}
但是,这些似乎都不起作用。这样做的“正确”方法是什么,是否有更好的文档?

1 个答案:

答案 0 :(得分:1)

嗯,通常在需要线程安全代码时进行同步, 意思是这个线程进入cpu而没有其他线程 也会尝试到达那里,这也称为&#34;获取对象的锁定&#34;, &#34;获得锁定&#34;,&#34;锁定对象&#34;或&#34;同步对象&#34;  当然,你应该永远记住,作为Java设计师,没有任何保证 经常陈述.. 无论如何,为了运行一个线程并将它同步到包含该线程的类 应该做两个中的一个: 1.扩展Thread类 要么 2.实现Runnable接口。  此类还应覆盖Thread类中定义的抽象方法 并在Runnable界面中调用&#34; public void run(){}&#34;, 实际上它起着&#34;主要&#34;线程的类。

让我们稍微解决一下。它比听起来容易得多:

class ThreadPractice implements Runnable{

 @override   //This annotation denotes that it overrides an abstract method from
             // the Runnable interface.
     public void run(){ // We've promised

      coutingStuff() ; // Calling the synchronized method from the run() method.

         }

      public void synchronized coutingStuff(){// now this is a synchronized method...

              for(int i=0; i<100; i++){// Creating a for loop that counts from 0 to 99...

               System.out.println("this is the "+i+" time that this loop runs");

                // Now, putting the thread to sleep for 1 second:


               try{
                    Thread.sleep(1000);

                     }catch(InterruptedException iex){

                         System.out.println(iex.getMessage());
                      }
               }// End for loop
       }// End public void synchronized coutingStuff(){....


          public static void main(String[] args){

             //Now creating a thread object:

             Runnable rnb = new ThreadPractice();
              Thread count = new Thread(rnb);
                 count.start(); // starts the thread that contains
                                 // the synchronized method.

                }// End main



        }// End of class ThreadPractice

我热烈建议你回顾有关线程的章节 在KS&amp; BB指南中,您可以在此处下载: http://firozstar.tripod.com/_darksiderg.pdf