【问题标题】:Multithreading in java interrupt()java中的多线程中断()
【发布时间】:2016-03-11 07:19:59
【问题描述】:

我正在尝试使用两个线程来查找元素,一旦第一个线程找到它将中断其他线程的元素 我将数组分成两部分(0-length/2)和(length/2 -n)来搜索它。 但我无法实现以下功能是我的代码。

public class Interruptt {

    public static void main(String[] args) {

        int[] arr = { 2, 3, 4, 5, 6, 7, 8, 9 };
        int data = 3;

        MyThread mT = new MyThread(arr, 0, arr.length / 2, data);

        Thread thread1 = new Thread(mT);

        MyThread mT1 = new MyThread(arr, arr.length / 2 + 1, arr.length, data);

        Thread thread2 = new Thread(mT);

        mT.setoT(thread2);
        mT1.setoT(thread1);

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            System.out.println("enddd");
        }

        System.out.println("Out");
    }

}

class MyThread implements Runnable {
    int arr[];
    int i;
    int data;
    int end;
    Thread oT;

    public MyThread(int[] arr, int i, int end, int data) {
        this.i = i;
        this.arr = arr;
        this.end = end;
        this.data = data;

    }

    @Override
    public void run() {

        for (int j = i; j < end; j++) {
            System.out.println(Thread.currentThread());
            if (arr[j] == data) {
                System.out.println("data found by thread"
                        + Thread.currentThread());

                oT.interrupt();
                break;
            }

        }
    }

    public void setoT(Thread oT) {
        this.oT = oT;
    }

}

【问题讨论】:

  • 唯一可以抛出InterruptedException 的地方是Thread.sleep,但是两个线程同时休眠,你会吞下异常......
  • 1) 为什么要睡觉。 2) 你从不检查isInterrupted() 标志,那么你为什么认为调用interrupt 会做任何事情呢??
  • 请检查帮助您解决问题的答案是否正确:)

标签: java arrays multithreading thread-sleep java-threads


【解决方案1】:

这似乎是一种运行多个线程来搜索数组的非常复杂的方法,而 Streams 似乎是为解决这个确切问题而构建的。

考虑:

int[] arr = {2, 3, 4, 5, 6, 7, 8, 9, 0};
int data = 2;
IntStream.of(arr)
        .parallel()
        .filter(i -> i == data)
        .findAny()
        .ifPresent(i -> System.out.println("Found"));

【讨论】:

  • 我猜是 Java 8?如果是,那么我认为指出这一点很好。
  • 为什么不是 Java 8?
【解决方案2】:

当您在 Thread 上调用 interrupt() 方法时,您正在向它发送一个优雅的信号,外部有人要求它停止。换句话说,JVM 只是将“willing-interrupting”线程中名为interrupted 的标志设置为true。可以使用isInterrupted()方法读取flag的值。

然后,由您在任务/线程内部检查 interrupted 线程是否由另一个线程设置。您可以在while 循环中围绕您的任务活动实现此行为,如下所示:

while (!done && !this.isInterrupted()) {
    // Do some cool stuff
}

希望有帮助:)

【讨论】:

    【解决方案3】:

    mTthread1mT1thread2 所以如果 oT 是要中断的线程,你应该设置:

    mT.setoT(thread2); mT1.setoT(thread1);

    而不是

    mT.setoT(thread1); mT1.setoT(thread2);

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2020-07-09
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多