Java多线程之---ThreadGroup 管理Thread

转自:http://blog.csdn.net/a352193394/article/details/39323427

当创建了好几个线程的时候,很多线程的工作任务是类似或者一致的,这样我们就可以使用ThreadGroup来管理他

们,ThreadGroup可以随时的获取在他里面的线程的运行状态,信息,或者一条命令关闭掉这个group里面的所有线

程,非常的简单实用,下面我们用一个例子来说明一下如何使用。


import java.util.Date;  
import java.util.Random;  
import java.util.concurrent.TimeUnit;  
  
public class SearchTask implements Runnable {  
  
    public SearchTask(Result result) {  
        this.result = result;  
    }  
  
    private Result result;  
  
    @Override  
    public void run() {  
        String name = Thread.currentThread().getName();  
        System.out.println("Thread Start " + name);  
        try {  
            doTask();  
            result.setName(name);  
        } catch (InterruptedException e) {  
            System.out.printf("Thread %s: Interrupted\n", name);  
            return;  
        }  
        System.out.println("Thread end " + name);  
    }  
  
    private void doTask() throws InterruptedException {  
        Random random = new Random((new Date()).getTime());  
        int value = (int) (random.nextDouble() * 100);  
        System.out.printf("Thread %s: %d\n", Thread.currentThread().getName(),  
                value);  
        TimeUnit.SECONDS.sleep(value);  
    }  
  
    public static void main(String[] args) {  
        //创建5个线程,并入group里面进行管理  
        ThreadGroup threadGroup = new ThreadGroup("Searcher");  
        Result result = new Result();  
        SearchTask searchTask = new SearchTask(result);  
        for (int i = 0; i < 5; i++) {  
            Thread thred = new Thread(threadGroup, searchTask);  
            thred.start();  
            try {  
                TimeUnit.SECONDS.sleep(1);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
        //通过这种方法可以看group里面的所有信息  
        System.out.printf("Number of Threads: %d\n", threadGroup.activeCount());  
        System.out.printf("Information about the Thread Group\n");  
        threadGroup.list();  
  
        //这样可以复制group里面的thread信息  
        Thread[] threads = new Thread[threadGroup.activeCount()];  
        threadGroup.enumerate(threads);  
        for (int i = 0; i < threadGroup.activeCount(); i++) {  
            System.out.printf("Thread %s: %s\n", threads[i].getName(),  
                    threads[i].getState());  
        }  
          
        waitFinish(threadGroup);  
        //将group里面的所有线程都给interpet  
        threadGroup.interrupt();  
    }  
  
    private static void waitFinish(ThreadGroup threadGroup) {  
        while (threadGroup.activeCount() > 9) {  
            try {  
                TimeUnit.SECONDS.sleep(1);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。 本书的新版本展示了如何利用Java线程工具的全部优势,并介绍了JDK 2线程接口中的最新变化。你将学习如何使用线程来提高效率,如何有效地使用它们,以及如何避免常见的错误。本书讨论了死锁、竞态条件以及饥饿等问题的细节,帮助你编写没有潜在bug的代码。 本书第二版提供了对ThreadThreadGroup类、Runnable接口和语言的同步操作符内容的全面讨论。它解释了如何在不同的平台上调度线程,如何开发CPUScheduler类来实现你自己的调度策略。其他扩展例子包括实现读/写锁、通用锁、任意作用域的锁和异步I/O的类。本版本还增加了广泛的例子,展示如何实现线程池和其他同步技术,如条件变量、屏障和守护锁。它展示了如何与非线程安全的类共同工作,并特别关注于Swing的线程问题。新增加的一章介绍了如何为多处理器机器编写并行代码。 简而言之,本书的新版涉及了有关线程的方方面面,从最简单的动画applet到最复杂的应用程序。如果你计划用Java做任何重要的事情,你将发现本书很有价值。 第一章 线程简介 第二章 Java线程API 第三章 同步技术 第四章 等待和通知 第五章 Java线程编程的例子 第六章 Java线程调度 第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组
要使用Java多线程消费Kafka,可以使用Kafka提供的Consumer API,并将其与Java多线程结合使用。以下是一些基本步骤: 1. 创建Kafka Consumer实例 首先,需要创建一个Kafka Consumer实例。可以使用Kafka提供的工厂类创建一个Consumer实例,如下所示: ```java Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test-group"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); ``` 2. 订阅Topic 接下来,需要订阅一个或多个Topic,以便从Kafka集群中获取数据。可以使用`subscribe()`方法进行订阅,如下所示: ```java consumer.subscribe(Arrays.asList("topic1", "topic2")); ``` 3. 创建消费者线程 为了使用多线程消费Kafka,需要创建一个或多个消费者线程,每个线程负责消费一个Partition的数据。线程可以使用Java的Executor框架来创建,如下所示: ```java ExecutorService executor = Executors.newFixedThreadPool(10); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { executor.submit(new ConsumerThread(record)); } } ``` 在上面的代码中,`poll()`方法获取来自Kafka的数据,并将其分配给一个或多个消费者线程进行处理。每个消费者线程都需要实现`Runnable`接口,并在`run()`方法中处理数据。例如: ```java public class ConsumerThread implements Runnable { private final ConsumerRecord<String, String> record; public ConsumerThread(ConsumerRecord<String, String> record) { this.record = record; } @Override public void run() { // 处理数据 System.out.println(Thread.currentThread().getName() + " received message: " + record.value()); } } ``` 在上面的代码中,`ConsumerThread`类实现了`Runnable`接口,并在`run()`方法中处理来自Kafka的数据。 4. 关闭Consumer实例 最后,需要在程序退出时关闭Kafka Consumer实例,以释放资源。可以使用`close()`方法进行关闭,如下所示: ```java consumer.close(); ``` 以上就是使用Java多线程消费Kafka的基本步骤。需要注意的是,多线程消费Kafka需要考虑各种并发和线程安全问题,例如数据竞争、重复消费、消息丢失等。因此,在实际应用中需要仔细设计和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值