是否可以在 hashmap 中存储线程对象?

蒂鲁马莱什

我有场景,我的一些调用10Thread秒,每个Thread都有等到Notifier类通知我要通知具体ThreadS,我做的是我使用HashMapThreadid作为keyThread实例作为值。后来Notifier我试图通过遍历map.get(threadId)给出Thread实例的地图来通知它,我试图调用通知但它正在抛出IllegalmonitorException. 我有疑问怎么是否同步HashMapThread在双方WaiterNotifier类..

package com.cgi.sample.jms.requestor;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class RequestorApplication {
    private final Object lock = new Object();
    public static String correlationId;

    public static String getCorrelationId() {
        correlationId = UUID.randomUUID().toString();
        return correlationId;
    }

    public static void main(String args[]) throws Exception {

        Map<Long, Thread> map = new HashMap<Long, Thread>();

        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 2; i++) {

            Waiter waiter = new Waiter(map);

            executor.execute(waiter);

            Notifier notifier = new Notifier(map);
            executor.execute(notifier);
        }

        System.out.println("All the threads are started");
    }
}

class Waiter implements Runnable {

    Map<Long, Thread> map;
    ExecutorService executor = Executors.newFixedThreadPool(5);

    public Waiter(Map<Long, Thread> map) {
        this.map = map;
    }

    public void run() {

        ExecutorService executor = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 2; i++) {

            Runner instance = new Runner();

            System.out.println("Executing thread " + " with " + Thread.currentThread().getName());

            long threadId = Thread.currentThread().getId();

            String threadname = Thread.currentThread().getName();

            executor.execute(instance);

            synchronized (map) {

                map.put(threadId, Thread.currentThread());

                try {
                    instance.wait();
                    System.out.println(threadname + "  Thread entered into waiting state!!!");
                    // Thread.currentThread().wait();
                    System.out.println(threadname + "  Thread woke up from wait!!!!!");

                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
            }
        }

    }

}

class Notifier implements Runnable {

    Map<Long, Thread> map;

    public Notifier(Map<Long, Thread> map)

    {
        this.map = map;
    }

    public synchronized void run() {

        synchronized (map) {

            for (Map.Entry<Long, Thread> entry : map.entrySet()) {

                System.out.println("stored threads in map are--->" + map.get(entry.getKey()));

                map.get(entry.getKey()).notify();

            }

        }
    }
}

class Runner implements Runnable {

    public void run() {
        System.out.println("runner invoked");

    }
}
豪尔赫·奥马尔·梅德拉

您的问题的答案是:YES因为线程是一个对象,它可以存储到 HashMap 中。

另外,@TJCrowder 告诉您,您使用通知的方式是错误的。这是因为您正在对没有 Thread ( map.get(entry.getKey()).notify();)锁定的对象调用通知您应该调用拥有线程锁notify的对象Runner( instance.notify()) 的 ,而不是您的代码向我们展示的:instance.wait();

首先!您必须instance将块与将使用该wait方法阻止线程的对象同步,例如:

synchronized(instance){ 
  try{
    instance.wait() 
  }catch(...)
  {
     //Do Something else
  }
}

并且,调用notify对象的方法Runner停止等待并继续线程并离开同步块,如下所示:

map.get(entry.getKey()).getRunnerInstance().notify();

但是,请考虑一下,使用您当前的代码很难实现此提示,因为您必须重写几个部分,例如:您使用处于 for 循环上下文中的对象来阻塞线程的代码

for (int i = 0; i < 2; i++) {

  Runner instance = new Runner();
  //...
  synchronized (map) {

            map.put(threadId, Thread.currentThread());

            try {
                instance.wait(); //You are blocking over a instance declared into the For Loop.
            }catch(..){
               //..
            };
  }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaScript中的JSON是否存储在HashMap中?

来自分类Dev

可以总结HashMap中的对象值吗?

来自分类Dev

在HashMap中存储HashMap

来自分类Dev

HashMap是否可以在1.7中序列化,可以在1.6中使用?

来自分类Dev

我可以在Java的HashMap对象中存储多少个元素

来自分类Dev

HashMap是否可以通过字符串类型提供对对象数组的有效访问?

来自分类Dev

是否可以从一种HashMap方法中同时获取Interger和String值?

来自分类Dev

Java中是否可以包含3种不同类型的HashMap?

来自分类Dev

java性能:是否将hashMap值存储在变量冗余中?

来自分类Dev

显示存储在HashMap中的对象值

来自分类Dev

是否可以将HashSet用作HashMap的键?

来自分类Dev

是否可以将HashSet用作HashMap的键?

来自分类Dev

查找HashMap中是否已存在对象

来自分类Dev

是否可以在异常中存储其他对象?

来自分类Dev

是否可以将数组存储到对象数组中?

来自分类Dev

如何验证HashMap中是否存在值

来自分类Dev

检查至少HashMap中的Value是否匹配?

来自分类Dev

在HashMap中存储ArrayList

来自分类Dev

如果存在条目,是否可以通过某种方式插入HashMap中,从而为您提供密钥的拥有者副本?

来自分类Dev

Hashmap 搜索中的 Hashmap

来自分类Dev

使用线程ID检索该特定线程的值,将对象存储在静态类的哈希中是否安全?

来自分类Dev

遍历Hashmap中的对象

来自分类Dev

使用HashMap在Java中存储和检索对象

来自分类Dev

是否可以创建由* const Any类型的键控的“ HashMap”?

来自分类Dev

是否可以构建包含&str引用环境变量的HashMap?

来自分类Dev

是否可以获取主线程的线程对象,并带有`join()`?

来自分类Dev

是否可以等待C#中的线程

来自分类Dev

是否可以在FX线程中显示节点

来自分类Dev

在HashMap中存储闭包

Related 相关文章

  1. 1

    JavaScript中的JSON是否存储在HashMap中?

  2. 2

    可以总结HashMap中的对象值吗?

  3. 3

    在HashMap中存储HashMap

  4. 4

    HashMap是否可以在1.7中序列化,可以在1.6中使用?

  5. 5

    我可以在Java的HashMap对象中存储多少个元素

  6. 6

    HashMap是否可以通过字符串类型提供对对象数组的有效访问?

  7. 7

    是否可以从一种HashMap方法中同时获取Interger和String值?

  8. 8

    Java中是否可以包含3种不同类型的HashMap?

  9. 9

    java性能:是否将hashMap值存储在变量冗余中?

  10. 10

    显示存储在HashMap中的对象值

  11. 11

    是否可以将HashSet用作HashMap的键?

  12. 12

    是否可以将HashSet用作HashMap的键?

  13. 13

    查找HashMap中是否已存在对象

  14. 14

    是否可以在异常中存储其他对象?

  15. 15

    是否可以将数组存储到对象数组中?

  16. 16

    如何验证HashMap中是否存在值

  17. 17

    检查至少HashMap中的Value是否匹配?

  18. 18

    在HashMap中存储ArrayList

  19. 19

    如果存在条目,是否可以通过某种方式插入HashMap中,从而为您提供密钥的拥有者副本?

  20. 20

    Hashmap 搜索中的 Hashmap

  21. 21

    使用线程ID检索该特定线程的值,将对象存储在静态类的哈希中是否安全?

  22. 22

    遍历Hashmap中的对象

  23. 23

    使用HashMap在Java中存储和检索对象

  24. 24

    是否可以创建由* const Any类型的键控的“ HashMap”?

  25. 25

    是否可以构建包含&str引用环境变量的HashMap?

  26. 26

    是否可以获取主线程的线程对象,并带有`join()`?

  27. 27

    是否可以等待C#中的线程

  28. 28

    是否可以在FX线程中显示节点

  29. 29

    在HashMap中存储闭包

热门标签

归档