Java线程:是否有任何结果不能作为这些程序的输出? (代码给出)

时间:2011-10-10 00:43:46

标签: multithreading threadpool

上周我有一个针对Threads的测验,我错误地提到了这两个问题。我想知道是否有人可以帮我找到合适的答案。感谢。

是否有任何结果不能作为此程序的输出? 我对这些问题感到困惑。我运行程序,发现Bbccaa是可能的,aaccbb是可能的,ccbbaa是可能的,aabbcc是可能的。

public class Test4 extends Thread { //8
  public Test4(String name) { 
   super(name); 
  } 
  public void run() { 
   print(getName()); 
  } 
  public static synchronized void print(String n) { 
   System.out.print(n); 
   try { sleep(...); } catch (Exception ex) {} // unspecified random time 
   System.out.print(n); 
  } 
  public static void main(String argv[]) throws Exception { 
   Test4 ta = new Test4("a"); 
   Test4 tb = new Test4("b"); 
   Test4 tc = new Test4("c"); 
   ta.start(); 
   tb.start(); 
   tc.start(); 
   ta.join(); 
   tb.join(); 
   tc.join(); 
  } 
}

此代码的相同问题 Abab是可能的,baab是可能的,baba是可能的。我对这些问题感到困惑。是否有任何技巧或提示可以帮助我了解哪些输出是不可能的。

public class Test3 extends Thread { 
  public Test3(String name) { 
   super(name); 
  } 
  public void run() { 
   print(getName()); 
  } 
  public static void print(String n) { 
   System.out.print(n); 
   try { sleep(...); } catch (Exception ex) {} 
   System.out.print(n); 
  } 
  public static void main(String argv[]) throws Exception { 
   Test3 ta = new Test3("a"); 
   Test3 tb = new Test3("b"); 
   Test3 tc = new Test3("c"); 
   ta.start(); 
   tb.start(); 
   ta.join(); 
   tb.join(); 
  } 
}

2 个答案:

答案 0 :(得分:1)

关键点是方法签名中的synchronized关键字。这就是为什么你总是在第一个字母中连续出现两个字母(例如cc)。如果没有(第二个),唯一的限制是ab打印两次(按某种顺序),并且不会打印其他字符。

运行程序对测试线程没有帮助。你必须证明它为什么是正确的。

答案 1 :(得分:0)

马修是第一个正确的。所以它可以有像aabbcc或ccbbaa这样的东西,只要它是连续的,因此是synchronized项。

第二个我认为代码不打印aacc。告诉我,如果我错了