java - 线程和中断

标签 java multithreading interrupt

我有以下代码

package threads;

import java.util.ArrayList;
import java.util.List;

public class Threads extends Thread implements Runnable {

    private final List<Thread> threadList = new ArrayList<>();
    private String f, l;
    private Thread greetings1, greetings;

    public static void main(String[] args) {

        String[] elements = { "Tim", "Fred", "Jeff", "Scott" };
        Threads t = new Threads();
        for (String e : elements) {
            t.threadL(e);

            t.threadR(e);
        }

        for (int index = 0; index < t.threadList.size(); index++) {
            // blank at the moment

        }
    }

    public void threadR(String f) {
        greetings = new Thread(f);

        Thread greetingsFromFred = new Thread(greetings) {

            @Override
            public void run() {
                for (int i = 1; i < 5; i++) {
                    try {
                        System.out.println("Main Thread: " + i + " " + f);
                        Thread.sleep(5000);

                    } catch (InterruptedException ex) {
                        System.out.println("Main thread interrupted.");

                    }
                    System.out.println("Main thread exiting.");
                }
            }
        };
        greetingsFromFred.start();
    }

    public List<Thread> threadL(String l) {
        greetings1 = new Thread(this);

        this.l = l;
        greetings1.start();

        threadList.add(greetings1);

        return (threadList);

    }

    @Override
    public void run() {

        greetings.interrupt(); // interrupt greetings thread here <-------

        System.out.println("Greetings from " + l + "! threadL");

    }
}

当 threadL 运行时,我想中断 threadR 的运行,因此导致

 System.out.println("Main thread interrupted.");

从threadR打印

我已经在我的代码中突出显示了应该发生中断的地方

 greetings.interrupt();  //interrupt greetings thread here <-------

为什么中断不能正常工作?

最佳答案

您的程序有点像线程对象的迷宫。让我们尝试从 main 开始。

main 中,您创建了一个类型为 Threads 的对象 t。这意味着它是一个 Thread 和一个 Runnable

然后,对于您的每个字符串,您运行 tthreadLthreadR 并将该字符串作为参数。

main 中没有任何地方是您实际启动 t,甚至直接运行它的 run 方法。

然后,在 threadR 中创建一个新的空 Thread 并将其分配给 greetings

然后您将那个新的空 Thread(问候)用作 Runnable,它被传递给一个新的 Thread 对象,该对象也有它的 run 方法被覆盖。这是徒劳的。在任何情况下,greetingsFromFred 都会启动,并将运行循环。但是 greetings 仍然包含与 greetingsFromFred 线程无关的空 Thread

threadL 中,您创建了另一个 Thread,将当前 Thread(即 tmain) 中作为其可运行的。然后你终于开始了。它将尝试中断 greetings 中的线程,但正如我们所说,这是一个从未启动的非 Activity 空线程。

你的结构应该没有那么复杂。尽可能只对应该执行的事情使用 Runnable 对象。因此,Threads 本身应该是一个 Runnable,而 threadR 应该固定为如下所示:

public void threadR(String f) {

    Runnable greetingsFromFred = new Runnable() {

        @Override
        public void run() {
            for (int i = 1; i < 5; i++) {
                try {
                    System.out.println("Main Thread: " + i + " " + f);
                    Thread.sleep(5000);

                } catch (InterruptedException ex) {
                    System.out.println("Main thread interrupted.");

                }
                System.out.println("Main thread exiting.");
            }
        }
    };

    greetings = new Thread(greetingsFromFred, f);
    greetings.start();
}

这样,greetings 将成为一个 Thread,它将运行您在 Runnable 中创建的 循环,还有名字 f

但是请注意:由于您实际上并没有在 catch 子句中停止循环,因此当线程被中断时您不会退出循环,并且您可能会得到“Exiting "消息打印不止一次,具体取决于中断何时进入循环。

关于java - 线程和中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34575880/

相关文章:

java - [HY000][1215] 无法添加外键约束

java - HashMap如何保证使用key的hashcode计算出的索引在可用范围内?

java - 我怎样才能找到我的线程在哪里被中断?

.net - .NET 中的单元测试 System.Threading.Timer

java - 在 Thread 上调用 interrupt(),但它从未被中断

java - 将用户输入(从 TextField)传递到另一个类?

java - 记住从 Java 文件中读取的第一个值

vector 中的 C++ 多线程和进程

arm - 在 ARM cortex A-9 的 U-boot 中启用中断

c - 中断处理程序是否有超时?