运行while语句后结束Java线程

bob*_*mac 7 java multithreading

我的程序完成后,我遇到一个问题就是结束线程.我运行一个线程时钟对象,它工作得很好,但我需要结束所有线程,当时间'=='一小时这一点似乎工作我只需要知道如何结束它们.下面是我所拥有的代码示例,除了此代码上面定义的一个int之外,这是run方法中唯一运行的东西.

    @Override
    public void run()
    {
        int mins = 5;
        while(clock.getHour() != 1)
        {
            EnterCarPark();
            if(clock.getMin() >= mins)
            {
                System.out.println("Time: " + clock.getTime() + " " + entryPoint.getRoadName() + ": " + spaces.availablePermits() + " Spaces");
                mins += 5;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是当你继续观察在netbeans调试模式下运行的线程时,它们会在一小时后继续运行,但不确定如何解决这个问题.我尝试过中断调用,但似乎什么也没做.

在此输入图像描述

Thi*_*ler 10

有两种方法可以以一种很好的方式阻止一个线程,一种以邪恶的方式阻止一个线程.

对于所有人,您需要访问线程的对象(或者在第一种情况下是在该线程上执行的Runnable类).

因此,您的首要任务是确保您可以访问要停止的所有线程的列表.另请注意,在处理多个线程使用的对象时,您需要确保使用线程安全通信!

现在您有以下选择

中断机制

调用Thread.interrupt()每个线程.InterruptedException如果你处于阻塞函数中,这将抛出一个线程.否则它只会设置isInterrupted()标志,所以你也必须检查它.这是一种非常干净且通用的方法,它将尝试通过此线程中断阻塞函数.然而,许多人不知道如何很好地反应InterruptedException,所以它可能是更容易出现错误.

isRunning标志

在你的线程中有一个布尔值'isRunning'.while循环调用一个函数'stopRunning()',将此布尔值设置为false.在您的线程中,您会定期读取此布尔值并在设置为false时停止执行.这个布尔值需要是线程安全的,这可以通过创建volatile(或使用synchronized锁定)来完成.

当你拥有a时Runnable,这也很有效,这是目前在线程上运行任务的建议方式(因为你可以很容易地移动RunnablesThreadpools等等).

停止线程(EVIL)

第三种,EVIL和弃用方式是调用Thread.stop().这是非常不安全的,可能会导致意外行为,不要这样做!

  • 实际上,当你仍然保持`Thread`对象时,`isRunning`标志通常是多余的,因为`interrupt()`有[相同的功能](http://docs.oracle.com/javase/8 /docs/api/java/lang/Thread.html#isInterrupted--),加上一些.另请注意,许多阻塞操作是*不可中断,例如网络(套接字)IO,因此必须使用其他方法,例如从另一个线程关闭套接字. (3认同)