上周我有一个针对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();
}
}
答案 0 :(得分:1)
关键点是方法签名中的synchronized关键字。这就是为什么你总是在第一个字母中连续出现两个字母(例如cc
)。如果没有(第二个),唯一的限制是a
和b
打印两次(按某种顺序),并且不会打印其他字符。
运行程序对测试线程没有帮助。你必须证明它为什么是正确的。
答案 1 :(得分:0)
马修是第一个正确的。所以它可以有像aabbcc或ccbbaa这样的东西,只要它是连续的,因此是synchronized
项。
第二个我认为代码不打印aacc。告诉我,如果我错了