2017-09-02 48 views
0

ここにコードを入力してください。私は、スレッド1とスレッド2の2つのスレッドと、null値を持つhashmapを持っています。Javaで2つのスレッドを持つHas​​hMapのキーを印刷しますか?

"こんにちは" ヌル

"お客様" は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(); 

     } 
    } 
} 
+1

そして、問題がありますか? – Kamil

+0

キーを一度印刷する方法を見つけることができません。 @Kamil –

+0

リストにキーを集め、半分に分割し、最初の半分を最初のスレッドに渡し、後半を2番目のスレッドに渡し、両方のスレッドを開始しますか?なぜあなたはそれをやるのか分かりませんが、できます。マルチスレッドで練習したい場合は、より現実的で便利なユースケースが必要です。 –

答えて

2

はわずか2つのスレッドでExecutorServiceのにタスクとして各キーを渡す:

ExecutorService executorService = Executors.newFixedThreadPool(2); 

map.keySet().forEach(key -> executorService 
    .execute(() -> System.out.println('\"' + key + "\" : \"Printed by " + Thread.currentThread().getName() + '\"'))); 

executorService.shutdown(); 
executorService.awaitTermination(5, TimeUnit.SECONDS); 
+0

スレッド名にプール名を取り除く方法はありますか? –

+1

@RaviGodara確か:第2引数として 'ThreadFactory'を取る' newFixedThreadPool'メソッドを使い、好みのスレッドに名前をつけるものを渡してください。 – bowmore

+0

それは動作します、もう1つの質問、なぜExecutorサービスがスレッドセーフで動作していますか? 2つのスレッドを別々に作成するのとは異なります。 –

関連する問題