【发布时间】:2018-06-11 12:29:34
【问题描述】:
假设我们想要在一个包含 n 个元素的数组中搜索一个元素,并且我们可以创建任意数量的线程。让我们为数组的每个元素分配一个单独的线程,并考虑比较操作比创建线程要昂贵得多。说这样的搜索算法是O(1)是否有效?
代码:
import java.util.concurrent.atomic.AtomicBoolean;
public class scratch {
static int[] a = new int[100];
static final int n = 3;
static boolean expensiveCompare(int pos) {
try {
Thread.sleep(1000);
} catch (InterruptedException e){}
return a[pos] == n;
}
static AtomicBoolean answer = new AtomicBoolean(false);
public static void main(String... args) {
long start = System.currentTimeMillis();
a[2] = 3;
Thread[] threads = new Thread[100];
for(int i=0; i < 100; ++i) {
final int k = i;
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
if(expensiveCompare(k)) {
answer.compareAndExchange(false, true);
}
}
});
threads[i].start();
}
for(int i = 0; i < 100; ++i) {
try {
threads[i].join();
}catch (InterruptedException e) {}
}
System.out.println("Elapsed: " + (System.currentTimeMillis() - start));
System.out.println("Answer:" + answer);
}
}
打印:“经过:1000”
public class scratch {
static final int n = 3;
static int[] a = new int[100];
static boolean answer = false;
static boolean expensiveCompare(int pos) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
return a[pos] == n;
}
public static void main(String... args) {
long start = System.currentTimeMillis();
a[2] = 3;
for (int i = 0; i < 100; ++i) {
answer |= expensiveCompare(i);
}
System.out.println("Elapsed: " + (System.currentTimeMillis() - start));
System.out.println("Answer:" + answer);
}
}
打印:“Elapsed 100000”。
【问题讨论】:
-
Here 是一个有趣的问题。与您的问题没有直接关系,但总体而言是不错的阅读。
-
说到 linear 搜索有点冒险,因为这意味着对数组进行有序扫描,这是一个无法并行化的内在顺序过程。你应该放弃限定符。