Потоки Java: Есть ли какие-либо результаты, которые НЕ МОГУТ быть результатом этих программ?(код дан) - PullRequest
0 голосов
/ 10 октября 2011

На прошлой неделе у меня был тест на темы, и я неправильно понял эти 2 вопроса. Мне было интересно, если кто-нибудь может помочь мне получить правильный ответ на эти вопросы. Спасибо.

Есть ли какие-либо результаты, которые НЕ МОГУТ быть результатом этой программы? Я путаюсь с такими вопросами. Я запустил программу и обнаружил, что 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(); 
  } 
}

Тот же вопрос для этого кода Абав возможен, бааб возможен, баба возможна. Я путаюсь с такими вопросами. Есть ли какие-нибудь хитрости или советы, которые помогут мне понять, какой вывод невозможен.

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 ]

1 голос
/ 10 октября 2011

Ключевым моментом является синхронизированное ключевое слово в сигнатуре метода. Вот почему у вас всегда есть две буквы подряд в первой (например, cc). Без этого (второго) единственным ограничением является то, что a и b печатаются ровно дважды (в некотором порядке), и никакие другие символы не печатаются.

Запуск программы не так полезен для тестирования потоков. Вы должны продемонстрировать, почему это правильно.

0 голосов
/ 14 октября 2011

Мэтью подходит первым. Таким образом, он может иметь что-то вроде aabbcc или ccbbaa, если он последовательный, отсюда и термин synchronized.

Второй, я думаю, код не распечатает aacc. Скажи мне, если я не прав

...