【发布时间】:2015-04-27 16:47:33
【问题描述】:
我正在学习 Java 中的 multithreading。问题陈述是:假设有一个数据结构可以包含数百万个整数,现在我想在其中搜索一个键。我想使用 2 个线程,这样如果任何一个线程找到密钥,它应该将共享布尔变量设置为 false,并且两个线程都应该停止进一步处理。
这是我正在尝试的:
public class Test implements Runnable{
private List<Integer> list;
private Boolean value;
private int key = 27;
public Test(List<Integer> list,boolean value) {
this.list=list;
this.value=value;
}
@Override
public void run() {
synchronized (value) {
if(value){
Thread.currentThread().interrupt();
}
for(int i=0;i<list.size();i++){
if(list.get(i)==key){
System.out.println("Found by: "+Thread.currentThread().getName());
value = true;
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() +": "+ list.get(i));
}
}
}
}
主要课程是:
public class MainClass {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>(101);
for(int i=0;i<=100;i++){
list.add(i);
}
Boolean value=false;
Thread t1 = new Thread(new Test(list.subList(0, 49),value));
t1.setName("Thread 1");
Thread t2 = new Thread(new Test(list.subList(50, 99),value));
t2.setName("Thread 2");
t1.start();
t2.start();
}
}
我的期望:
两个线程都会随机运行,当任何一个线程遇到 27 时,两个线程都会被中断。所以,线程 1 不应该能够处理所有的输入,线程 2 类似。
但是,发生了什么:
两个线程都在完成循环,线程 2 总是在线程 1 完成后启动。
Please highlight the mistakes,我还在学习线程。
我的下一个练习题是:一个一个地访问任何共享资源
【问题讨论】:
-
你为什么用
synchronized? -
"shared boolean variable" 建议您可能想在相关的地方使用
static关键字... -
@MuratK。因为
boolean是共享资源?这不是正确的方法吗?? -
@JonK
AtomicBoolean不在这里工作吗? -
也许
static volatile boolean会起作用。
标签: java multithreading concurrency