0

我在这里有一个类将用作线程/可运行对象,下面的第二个类(UseSearch)有一个 main 方法,它实例化 Search 类的两个实例并使用它们创建两个线程。如您所见,run 方法根据传入的方向调用运行循环的 add 方法。我正在寻找一种机制,该机制将导致一个线程在另一个线程完成时停止另一个线程的循环迭代运行它的迭代。任何帮助/建议将不胜感激。我看过一个类似的例子,但它对我来说太复杂了,无法理解。- 杰维森7x

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();
    }
}
4

2 回答 2

1

进行迭代的线程需要在每次迭代时测试一些东西,看看它是否被告知要停止。这可以是自定义标志(以多种方式实现)或线程interrupted标志。

如果您要使用interrupt,那么马特克拉克的答案就是一半。另一半是迭代线程需要做这样的事情:

    if (Thread.currentThread.isInterrupted()) {
        // pause or stop or break out of the loop or whatever
    }

...在相关循环或循环的主体中。


注意:Java 中没有安全的方法来停止或暂停另一个不定期检查是否应该停止/暂停的线程;即不合作的线程。

于 2013-06-09T05:08:26.257 回答
0

长答案简短...使线程类范围的变量,以便每个线程都可以访问另一个:

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();
        }
    };
}
于 2013-06-09T04:05:21.653 回答