2015-11-15 141 views
0

我有一个程序,如下所示。我想要三个并发线程使用线程同步将不同的字符串添加到infiList(“This”,“is”,“infinite”)。例如:多线程|| Java

我想附加某些线程,例如;

  • 如果infiList的最后一个字是当前“这个”,该线程应该追加词“是” infiList

  • 如果infiList中的最后一个字词当前为“is”,则线索应在“infiList”上附加单词“infinite”。

  • 如果infiList中的最后一个词当前是“无限”,或者infiList仍然为空,则该线程应该在infiList附加单词“This”。

  • infiList在任何时候只应在列表的开头或直接在“无限”出现之后包含“This”,在列表中直接出现“This”之后应该在列表中出现“is” “无限”应该 只发生在“是”之后。

任何有关如何做到这一点的帮助表示赞赏。

import java.util.ArrayList; 

public class Multithreading implements Runnable { 

public static ArrayList<String> infiList = new ArrayList<>(); 

@Override 
public void run() { 
    for (int i=0; i<100; i++) { 
     String s = null; 
     synchronized (infiList) { 
      if(infiList.isEmpty()) 
       infiList.add("This"); 
      else 
      { 
       s = infiList.get(infiList.size()-1); 

      if(s.equals("This")) 
       infiList.add("is"); 
      else if(s.equals("is")) 
       infiList.add("infinite"); 
      else if(s.equals("infinite")) 
       infiList.add("This"); 
      } 
     } 
    } 
} 

public static void main (String args[]) { 
    // Create three concurrent threads 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 

} 
} 

回答

1

非常天真的快速解决问题。同步将获得一个锁,在arraylist,检查元素,并根据您的规则插入它。但是由于你的逻辑取决于最后一个元素,同时向元素添加元素,同时维护元素的顺序,这实际上不是多线程的,而是一个顺序程序。

这只是因为,当多线程程序运行时,您并不在乎排序顺序,因为您永远无法保证它。在大多数情况下,您将进入分割和征服者样式算法,其中算法将被拆分成片段并进行计算。

@Override 
public void run() { 
    for(int i = 0; i < 100; i++) { 
     String s = null; 
     synchronized (infiList) { 
      if(infiList.isEmpty()) 
       infiList.add("This"); 
      else 
      { 
       s = infiList.get(infiList.size()-1); 

      if(s.equals("This")) 
       infiList.add("is"); 
      else if(s.equals("is")) 
       infiList.add("infinite"); 
      else if(s.equals("infinite")) 
       infiList.add("This"); 
      } 
     } 
    } 
} 

如何利用多线程

如果我们在另一种情况下,你需要你把它放入数组之前计算的东西看你的榜样。这可能会导致更好地利用多线程性能。

@Override 
public void run() { 
    while (true) { 
     String s = null; 

     CalculateSomethingBig(); 

     synchronized (infiList) { 
      ... 
     } 
    } 
} 

如果我们用这种思想发挥,这一次运行时处于内CalculateSomethingBig(),它将会利用更多的多任务处理能力的计算机,因为更多的线程将使用时间来计算,并利用处理能力,然后等待在被释放的锁上。

如何获得输出

public static void main(String args[]) { 
    // Create three concurrent threads 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 

    for(String s : infiList) 
     System.out.println(s); 
} 
+0

当我尝试运行此,我得到多个错误'“异常线程‘线程0’显示java.lang.NullPointerException \t在Multithreading.run(多线程.java:17) \t at java.lang.Thread.run(Unknown Source)“' –

+0

但是你的循环将永远运行...或者可能是无限的:) –

+0

你的代码永远不会执行你有while while(true) –