• 线程的分组


      Java API提供了一个有趣的功能,它能够把线程分组。这允许我们把一个组的线程当成一个单一的单元,对组内线程对象进行访问并操作他们。例如,对于一些执行同样任务的线程,你想控制它们,不管多少线程在运行,只需要一个单一的调用,所有这些线程的运行都会被中断。

      Java提供ThreadGroup类表示一组线程。线程组可以包含线程对象,也可以包含其他的线程组对象,它是一个树形结构。

      下面我们学习使用ThreadGroup对象类开发一个简单的范例:创建10个线程并让它们休眠一个随机的时间(例如模拟一个查询),当其中一个线程查找成功的时候,我们将中断其它9个线程。

    1. 创建一个名为Result的类

    public class Result {
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    }

    2. 创建一个名为SearchTask的类

    import java.util.Date;
    import java.util.Random;
    import java.util.concurrent.TimeUnit;
    
    
    public class SearchTask implements Runnable {
        private Result result;
        public SearchTask(Result result){
            this.result = result;
        }
        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            System.out.printf("Thread %s: Start
    ", name);
            try {
                doTask();
                result.setName(name);
            } catch (InterruptedException e) {
                System.out.printf("Thread %s: Interrupted
    ", name);
                return;
            }
            System.out.printf("Thread %s: End
    ", name);
        }
    
        private void doTask() throws InterruptedException{
            Random r = new Random((new Date()).getTime());
            int value = (int) (r.nextDouble()*100);
            System.out.printf("Thread %s: %d
    ", Thread.currentThread().getName(), value);
            TimeUnit.SECONDS.sleep(value);
        }
        
    }

    3. 创建主类Main

    import java.util.concurrent.TimeUnit;
    
    
    public class Main {
    
        public static void main(String[] args) {
            //创建线程组
            ThreadGroup threadGroup = new ThreadGroup("Searcher");
            Result result = new Result();
            SearchTask st = new SearchTask(result);
            try {
                for(int i=0;i<10;i++){
                    Thread t = new Thread(threadGroup, st);
                    t.start();
                    TimeUnit.SECONDS.sleep(1);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.printf("Number of Threads: %d
    ", threadGroup.activeCount());
            System.out.printf("Information about the Thread Group
    ");
            threadGroup.list(); //打印线程组的信息
            Thread[] threads = new Thread[threadGroup.activeCount()];
            threadGroup.enumerate(threads);
            for(int i=0;i<threadGroup.activeCount();i++){
                System.out.printf("Thread %s: %s
    ", threads[i].getName(), threads[i].getState());
            }
            //等到线程组的第一个线程运行结束
            try {
                while(threadGroup.activeCount()>9){
                    TimeUnit.SECONDS.sleep(1);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //中断线程组中的其它线程
            threadGroup.interrupt();
        }
    }

    4. 程序运行结果如下

    Thread Thread-0: Start
    Thread Thread-0: 75
    Thread Thread-1: Start
    Thread Thread-1: 11
    Thread Thread-2: Start
    Thread Thread-2: 99
    Thread Thread-3: Start
    Thread Thread-3: 27
    Thread Thread-4: Start
    Thread Thread-4: 18
    Thread Thread-5: Start
    Thread Thread-5: 46
    Thread Thread-6: Start
    Thread Thread-6: 37
    Thread Thread-7: Start
    Thread Thread-7: 18
    Thread Thread-8: Start
    Thread Thread-8: 6
    Thread Thread-9: Start
    Thread Thread-9: 34
    Number of Threads: 10
    Information about the Thread Group
    java.lang.ThreadGroup[name=Searcher,maxpri=10]
        Thread[Thread-0,5,Searcher]
        Thread[Thread-1,5,Searcher]
        Thread[Thread-2,5,Searcher]
        Thread[Thread-3,5,Searcher]
        Thread[Thread-4,5,Searcher]
        Thread[Thread-5,5,Searcher]
        Thread[Thread-6,5,Searcher]
        Thread[Thread-7,5,Searcher]
        Thread[Thread-8,5,Searcher]
        Thread[Thread-9,5,Searcher]
    Thread Thread-0: TIMED_WAITING
    Thread Thread-1: TIMED_WAITING
    Thread Thread-2: TIMED_WAITING
    Thread Thread-3: TIMED_WAITING
    Thread Thread-4: TIMED_WAITING
    Thread Thread-5: TIMED_WAITING
    Thread Thread-6: TIMED_WAITING
    Thread Thread-7: TIMED_WAITING
    Thread Thread-8: TIMED_WAITING
    Thread Thread-9: TIMED_WAITING
    Thread Thread-1: End
    Thread Thread-3: Interrupted
    Thread Thread-2: Interrupted
    Thread Thread-0: Interrupted
    Thread Thread-4: Interrupted
    Thread Thread-6: Interrupted
    Thread Thread-5: Interrupted
    Thread Thread-8: Interrupted
    Thread Thread-7: Interrupted
    Thread Thread-9: Interrupted
  • 相关阅读:
    斐波那契数列递归算法和非递归算法以及其时间复杂度分析
    Python为什么不需要swap(a, b)
    学习MySQL中遇到的问题(net start mysql; 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助)
    python 3以上版本使用pickle.load读取文件报UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 6
    Mysql 服务无法启动 服务没有报告任何错误
    Keras和tensorflow的区别
    简单易懂的softmax交叉熵损失函数求导
    Ajax 请求
    Ajax 新建对象
    jquery Ajax noConflict()
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4906574.html
Copyright © 2020-2023  润新知