ここにコードを入力してください。私は、スレッド1とスレッド2の2つのスレッドと、null値を持つhashmapを持っています。Javaで2つのスレッドを持つHashMapのキーを印刷しますか?
"こんにちは" ヌル
"お客様" はnull
:今、私は再び入力HashMapを、それを印刷せずに、print文を実行しているそれぞれのスレッドでのHashMapのキーを印刷したいです
"値" ヌル"さようなら" はnull
出力:
"さようなら":スレッド1" によって印刷された
"こんにちは": "スレッド2によって印刷された"
"値": "スレッド2によって印刷された"
"Customer": "Thread1で印刷"
以下のコードでは印刷できません。
import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class Test2 implements Runnable { volatile static HashMap<String, String> map; static Object mutex = new Object(); static volatile int i = 1; public static void main(String[] args) throws InterruptedException { map = new HashMap(); map.put("Public", null); map.put("Sort", null); map.put("Message", null); map.put("Customer", null); map.put("Bank", null); // ConcurrentHashMap chm= new ConcurrentHashMap(map); Collections.synchronizedMap(map); Thread t1 = new Thread(new Test2()); Thread t2 = new Thread(new Test2()); t1.start(); t2.start(); } @Override public void run() { synchronized (mutex) { for (Map.Entry entry : map.entrySet()) { if (entry.getValue() == null) { System.out.println(entry.getKey() + "\" : \"Printed by " + Thread.currentThread().getName() + '\"'); map.put((String) entry.getKey(), Thread.currentThread().getName()); if (Thread.currentThread().getName().contains("0")&&i==1) { try { mutex.notifyAll(); mutex.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (Thread.currentThread().getName().contains("1")&&i<=1) { try { mutex.notifyAll(); i++; mutex.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } mutex.notifyAll(); } } }
そして、問題がありますか? – Kamil
キーを一度印刷する方法を見つけることができません。 @Kamil –
リストにキーを集め、半分に分割し、最初の半分を最初のスレッドに渡し、後半を2番目のスレッドに渡し、両方のスレッドを開始しますか?なぜあなたはそれをやるのか分かりませんが、できます。マルチスレッドで練習したい場合は、より現実的で便利なユースケースが必要です。 –