请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

中断其他线程

假设 我有 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));
            }
        }

    }

正在回答 回答被采纳积分+3

1回答

悟空 2021-06-22 10:30:12

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕移动4253767 #1
    有点木讷   没懂起。
    解决方案一:
    添加一个 共享变量      volatile  static boolean v = false;
     run 方法里面修改一下:
     if(v){
                                Thread.currentThread().interrupt();
                            }
                            if (personList.get(t).getName().equals("小明")) { // 符合条件
             Thread.currentThread().interrupt();
                                v=true;}
    方法二:额外的添加一个 Person对象:当某个线程找到了 Person并赋值:
          final Person[] p = {new Person()};
    run 方法需要添加
    p[0] =personList.get(t);
    启动线程需要改变:
     for(Thread t:Threads){
         thread.start(); //start 原则 子线程能看见主线程启动子线程之前的任何操作
         thread.join();// join原则。主线程能看见子线程 在join 之前的任何操作;
    }
     while (p[0]!=null){
                for (Thread thread : threads) {
                    thread.interrupt();
                }
            }
    
    不知道这样的操作是否 满足这个需求
    回复 有任何疑惑可以回复我~ 2021-06-22 10:55:45
  • 悟空 回复 提问者 慕移动4253767 #2
    可以的,这样能感知到找到了元素。
    回复 有任何疑惑可以回复我~ 2021-06-22 13:17:09
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信