我这里有一个类用作线程/ Runnable对象,下面的第二个类(UseSearch)有一个main方法,用于实例化Search类的两个实例并使用它们创建两个线程。正如您所看到的,run方法调用运行循环的add方法,具体取决于传入的方向。我正在寻找一种机制,当另一个线程完成时,它将导致其中一个线程停止其他线程的循环迭代运行它的迭代。任何帮助/建议将受到高度赞赏。我见过类似的例子,但这对我来说太难理解了。 - Jevison7x
public class Search implements Runnable
{
int sum;
boolean direction;
String name;
public Search(String n, boolean positive)
{
this.direction = positive;
this.name = n;
}
void add()
{
if(direction == true)
{
for(int i = 0; i < 100; i++)
{
sum += 1;
System.out.println(name+" has "+sum);
}
}
else
{
for(int i = 0; i < 100; i++)
{
sum -= 1;
System.out.println(name+" has "+sum);
}
}
}
public void run()
{
add();
}
}
public class UseSearch
{
public static void main(String[] args)
{
Search s1 = new Search("bob", true);
Search s2 = new Search("dan", false);
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s2);
t1.start();
t2.start();
}
}
答案 0 :(得分:1)
正在进行迭代的线程需要在每次迭代时测试一些东西,看它是否被告知要停止。这可能是一个自定义标志(以各种方式实现)或线程的interrupted
标志。
如果您打算使用interrupt
,那么Matt Clark的答案就是其中的一半。另一半是迭代线程需要做这样的事情:
if (Thread.currentThread.isInterrupted()) {
// pause or stop or break out of the loop or whatever
}
...在相关循环或循环的主体中。
注意:Java中没有安全方式来停止或暂停另一个没有定期检查它是否应该停止/暂停的线程;即一个不是合作的线程。
答案 1 :(得分:0)
长答案短...... 创建Threads类范围的变量,以便每个线程都可以访问另一个:
Thread t1, t2;
public static void main(String[] args){
t1 = new Thread(){
public void run(){
t2.interrupt();
}
};
t2=new Thread(){
public void run(){
t1.interrupt();
}
};
}