Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在多线程环境中使用JedisPool创建多个Jedis实例_Java_Multithreading_Connection Pooling_Jedis - Fatal编程技术网

Java 如何在多线程环境中使用JedisPool创建多个Jedis实例

Java 如何在多线程环境中使用JedisPool创建多个Jedis实例,java,multithreading,connection-pooling,jedis,Java,Multithreading,Connection Pooling,Jedis,我尝试使用JedisSpool创建多个用于多线程的Jedis实例,每个线程可以有一个Jedis实例。但当我试图使用JedisPool.getResource创建多个实例时,它总是给我相同的Jedis实例。下面的代码还将为我提供redis.clients.jedis.exceptions.JedisConnectionException:由于多个线程只有一个jedis实例,所以流意外结束 private final static JedisPoolConfig poolConfig = build

我尝试使用JedisSpool创建多个用于多线程的Jedis实例,每个线程可以有一个Jedis实例。但当我试图使用JedisPool.getResource创建多个实例时,它总是给我相同的Jedis实例。下面的代码还将为我提供redis.clients.jedis.exceptions.JedisConnectionException:由于多个线程只有一个jedis实例,所以流意外结束

private final static JedisPoolConfig poolConfig = buildPoolConfig();
private static JedisPool jedisPool = new JedisPool(poolConfig, "localhost");

public static void main(String[] args) throws Exception {
    MyThread[] myThreads = new MyThread[4];
    for (int i = 0; i < myThreads.length; i++) {
       try (Jedis jedis = jedisPool.getResource()) {
           System.out.println("jedis " + i  + ": "+ jedis);
           myThreads[i] = new MyThread(jedis);
           myThreads[i].start();
       }
    }
    jedisPool.close();
}

private static JedisPoolConfig buildPoolConfig() {
    final JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(128);
    poolConfig.setMaxIdle(128);
    poolConfig.setMinIdle(16);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setTestOnReturn(true);
    poolConfig.setTestWhileIdle(true);
    poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis());
    poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis());
    poolConfig.setNumTestsPerEvictionRun(3);
    poolConfig.setBlockWhenExhausted(true);
    return poolConfig;
}
任何帮助都将不胜感激。谢谢

您应该在多线程环境中使用JedisPool。但是,通过你的实施,你实际上是在这种情况下使用绝地武士

为了解决这一问题,你可以选择绝地而不是绝地作为MyThread构造函数

public static void main(String[] args) throws Exception {
    MyThread[] myThreads = new MyThread[4];
    for (int i = 0; i < myThreads.length; i++) {
        myThreads[i] = new MyThread(jedisPool);
        myThreads[i].start();
    }
    jedisPool.close();
}

你能简要介绍一下你是如何在MyThread类中使用绝地的吗?@sazzad inside MyThread,它将使用Jedis.exists来查看指定的密钥是否存在。我正在尝试问题中提到的相同方法,并获得不同的绝地实例。这种方法有什么不正确之处。每个线程都有自己的绝地实例,这不是线程安全吗
class MyThread {
    void doSomething() {
        try (Jedis jedis = jedisPool.getResource()) {
            jedis.exists(key);
        }
    }
}