Как вы выясните, какой поток будет запущен первым? - PullRequest
1 голос
/ 13 марта 2019

У меня есть это упражнение, но я не понимаю причину правильного ответа:

 import java.util.Iterator; 
    import java.util.Map.Entry; 
    import java.util.concurrent.ConcurrentHashMap; 

    public class Cache {          
    static ConcurrentHashMap<String, Object> chm = new ConcurrentHashMap<String, Object>();          
    public static void main(String[] args) {         
            chm.put("a", "aaa");         
            chm.put("b", "bbb");         
            chm.put("c", "ccc");                  
            new Thread(){             
                public void run(){                 
                    Iterator<Entry<String, Object>> it = Cache.chm.entrySet().iterator();                 
                    while(it.hasNext()){                     
                        Entry<String, Object> en = it.next();                     
                        if(en.getKey().equals("a") || en.getKey().equals("b")){                         
                            it.remove();                
                        }                 
                    }    
                }         
            }.start();                  

            new Thread(){             
                public void run(){                 
                    Iterator<Entry<String, Object>> it = Cache.chm.entrySet().iterator();                 
                    while(it.hasNext()){                     
                        Entry<String, Object> en = it.next();                     
                        System.out.print(en.getKey()+", ");                 
                    }             
                }         
            }.start();             
    } 
}

Было 4 возможных ответа:

  1. Может печатать любую комбинацию клавиш.
  2. Может печатать любую комбинацию, кроме: c,
  3. Может печатать любую комбинацию, кроме: a, или b, или a, b или b, a
  4. Может печатать любую комбинацию, кроме: b, c,

Правильный ответ для этого упражнения - 3.

Почему это правильный ответ?

Я думал, что это упражнение может напечатать любую комбинацию клавиш, потому что в этой основной части есть два потока, поэтому я не знаю, какой из обоих запустится первым. Если второй поток начнется первым, у меня будут все ключи в ConcurrentHashMap, поэтому он напечатает a и b. Итак, мой ответ на это упражнение был 1. Но упражнение считает это неправильным ответом. Почему?

Как мне определить, какой поток будет запущен первым?

Большое спасибо!

A.

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Невозможно заранее определить, какой поток будет запущен первым, если вы сначала не создадите его.

Это зависит только от Scheduler, который является частью JVM. Это делает управление Thread.

Если вы хотите дождаться первого потока и затем запустить второй, вы можете легко использовать firstThread.join(), а затем запустить второй поток.

1 голос
/ 13 марта 2019

Мы не можем определить, какой поток запускается первым. Это полностью зависит от планировщика, который является частью JVM.

, если вы хотите выполнить оба потока в последовательности (один за другим), затем используйтеподождите и уведомите об этом (например, проблема производителя).

...