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