小编tho*_*mas的帖子

如果在静态初始化程序块中创建了线程,程序将挂起

我遇到过我的程序挂起的情况,看起来像死锁.但我尝试用jconsole和visualvm来解决它,但他们没有发现任何死锁.示例代码:

public class StaticInitializer {

private static int state = 10;

static {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            state = 11;
            System.out.println("Exit Thread");
        }
    });

    t1.start();

    try {
        t1.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("exiting static block");
}

public static void main(String...strings) {
    System.out.println(state);
}
}
Run Code Online (Sandbox Code Playgroud)

当我在调试模式下执行它时,我可以看到控制到达@Override public void run(){state = 11;

但只要执行state = 11,它就会挂起/死锁.我在stackoverflow中查看了不同的帖子,我认为静态初始化程序是线程安全的,但在这种情况下,jconsole应该报告这一点.关于主线程,jconsole说处于等待状态,那很好.但对于在静态初始化程序块中创建的线程,jconsole表示它处于RUNNABLE状态而未被阻止.我很困惑,这里缺乏一些概念.请帮帮我.

java multithreading deadlock static-initializer

20
推荐指数
3
解决办法
3201
查看次数

Java Kafka使用者组无法使用一些消息

注意到一个问题,其中Kafka消费者组(在java中实现)始终错过来自经纪人的一些消息.作为调试的第一线,通过kafka console consumer,我可以在代理中看到这些消息.

Kafka经纪人版:0.10.1.0

Kafka客户端版本:

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka_2.11</artifactId>
  <version>0.9.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

卡夫卡消费者配置:

Properties props = new Properties();
props.put("bootstrap.servers","broker1,broker2,broker3");
props.put("group.id", "myGroupIdForDemo");
props.put("key.deserializer", StringDeserializer.class.getName());
props.put("value.deserializer", StringDeserializer.class.getName());
props.put("heartbeat.interval.ms", "25000"); 
props.put("session.timeout.ms", "30000"); 
props.put("max.poll.interval.ms", "300000");
props.put("max.poll.records", "1");
props.put("zookeeper.session.timeout.ms", "120000");
props.put("zookeeper.sync.time.ms", "10000");
props.put("auto.commit.enable", "false");
props.put("auto.commit.interval.ms", "60000");
props.put("auto.offset.reset", "earliest");
props.put("consumer.timeout.ms", "-1");
props.put("rebalance.max.retries", "20");
props.put("rebalance.backoff.ms", "6000");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
Run Code Online (Sandbox Code Playgroud)

编辑 - 增加一些信息

我想补充一些信息:共有6个分区.但是,具有相同消费者组ID的主题的消费者总数为40.我知道有34位消费者闲着无所事事.

但是,我想要了解的一个方面是,如果消费者未能将代理发送的心跳发送到负载并重新分配分区,那么任何空闲消费者是否都有机会消费消息?此消息未被消耗的问题始终仅在某些分区中被注意到.我的意思是消息无法从同一分区传递/消费.

任何帮助表示赞赏.谢谢.

java apache-kafka

6
推荐指数
1
解决办法
1068
查看次数