中断其他线程

来源:5-4 遇到阻塞

慕移动4253767

2021-06-21

假设 我有 100000000 数据 需要找其中的某一条数据。
开启多线程,如果在某个线程中 第二次循环就找到了 我该怎么去通知其他线程进行中断。

 public static void main(String[] args) {
        //模拟数据集合
        List<Person> personList = new ArrayList<>();
        int max = 5000000;
        for (int i = 0; i < max; i++) {
            Person p = new Person();
            if (i == max - 1) {
                p.setName("小明");//唯一数据 :需要找到的数据
            } else {
                p.setName("小" + i); //其他数据
            }
            personList.add(p);
        }

        List<Thread> threads = new ArrayList<>(); //线程集合
        int threadcount = 10; //开启线程个数
        //开始时间
        long start = System.currentTimeMillis();
        for (int i = 1; i <= threadcount; i++) {
            int finalStart = (i - 1) * (max / threadcount);
            int finalEnd = i * (max / threadcount); 
            Thread thread = new Thread() { //创建线程
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "\t" + finalStart + "\t" + finalEnd);
                    for (int t = finalStart; t < finalEnd; t++) { //查查范围值
                        if (personList.get(t).getName().equals("小明")) { // 符合条件
                            System.out.println(System.currentTimeMillis() - start); // 输出使用时间
                            Thread.currentThread().interrupt();
                            //中断,我想问的是。当前线程找到了目标数据 ,如何中断其他线程
                            // 我要找的数据在  4000001 这个位置,循环二次就找到了
                            /***
                             *各个线程的区间查找
                             * Thread-9	4500000	5000000
                             * Thread-8	4000000	4500000
                             * Thread-7	3500000	4000000
                             * Thread-6	3000000	3500000
                             * Thread-5	2500000	3000000
                             * Thread-4	2000000	2500000
                             * Thread-3	1500000	2000000
                             * Thread-2	1000000	1500000
                             * Thread-1	500000	1000000
                             * Thread-0	0	500000
                             */
                        }
                    }
                }
            };
            threads.add(thread);
        }
        for (Thread thread : threads) {
            thread.start();
        }
        //常规查找耗时统计
        long start1 = System.currentTimeMillis();
        for (Person ps : personList) {
            if (ps.getName().equals("小明")) {
                System.out.println("常规for循环查找:" + (System.currentTimeMillis() - start1));
            }
        }

    }
写回答

1回答

悟空

2021-06-22

可以在run里把当前线程引用添加到threads里面,当找到了,就遍历threads,把线程都中断。

0
2
悟空
回复
慕移动4253767
可以的,这样能感知到找到了元素。
2021-06-22
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程