如何使一个线程对象停止java中的另一个线程对象

时间:2013-06-09 03:59:49

标签: java multithreading

我这里有一个类用作线程/ 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();
    }
}

2 个答案:

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