如何在一定时间到期后立即停止线程? [复制]

Posted

技术标签:

【中文标题】如何在一定时间到期后立即停止线程? [复制]【英文标题】:How to stop a thread as soon as a certain amount of time expires? [duplicate] 【发布时间】:2014-02-11 10:38:32 【问题描述】:

在经过一定时间后尝试立即停止线程时遇到问题,因为 thread.stop 和类似的其他线程已被贬值。

我试图停止的线程正在使用我的鼠标,我需要停止它,以便我可以以其他方式使用我的鼠标。

我在想的是下面的代码,这只是为了让另一个线程来观察主线程运行了多长时间,如果它还活着,就停止它,但我不能完成这个。

public void threadRun(int a) 
    Thread mainThread = new Thread(new Runnable() 
        @Override
        public void run() 
            // does things with mouse which may need to be ended while they
            // are in action
        
    );

    Thread watchThread = new Thread(new Runnable() 
        @Override
        public void run() 
            if (timeFromMark(mark) > a) 
                if (mainThread.isAlive()) 
                    // How can I stop the mainThread?
                
            

        
    );


【问题讨论】:

mainThread 可以自行监视并在给定时间后退出吗? 【参考方案1】:

您需要为您的第二个线程定义一个扩展可运行的类并将第一个线程作为参数传递。

然后你可以停止第一个线程。

但不要手动执行此操作,而是查看 Java ThreadPoolExecuter 及其 awaitTermination(long timeout, TimeUnit unit) 方法。 (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)

将节省大量工作。

    ExecutorService executor = Executors.newFixedThreadPool(1);

    Runnable r = new Runnable() 

        @Override
        public void run() 
            // TODO Auto-generated method stub
            try 
                System.out.println("doing stuff");
                Thread.sleep(10000);
                System.out.println("finished");
             catch (InterruptedException e) 
                System.out.println("Interrupted before finished!");
            
        
    ;

    executor.execute(r);
    executor.shutdown();
    try 
        executor.awaitTermination(1, TimeUnit.SECONDS);
        executor.shutdownNow();
     catch (InterruptedException e) 
        //
    
    System.out.println("Thread worker forced down. Continue with Application...");

生产:

doing stuff
Interrupted before finished!
Thread worker forced down. Continue with Application...

最后两条消息在时间上几乎相等,并且可能会改变位置(它的两个不同线程,继续)

【讨论】:

我似乎无法正确配置它...我只能实现 runnable 并且执行程序没有编译。不过,我想我找到了另一种方法,谢谢。【参考方案2】:

Java 已弃用用于显式终止另一个线程的方法(如 Thread.stop / Thread.destroy)。正确的方法是确保其他线程上的操作能够处理被告知停止的情况(例如,它们期望一个 InterruptedException,这意味着您可以调用 Thread.interrupt() 来停止它)。

取自How do I kill a thread from another thread in Java?

【讨论】:

【参考方案3】:

杀死/停止线程是个坏主意。这就是他们弃用这些方法的原因。最好要求线程停止。例如,类似于下面的示例。 (但请注意:如果“do_something()”需要很长时间,那么您可能需要使用中断来中止它。)

import java.util.concurrent.atomic.AtomicBoolean;

public class Stoppable 
    private AtomicBoolean timeToDie = new AtomicBoolean(false);
    private Thread thread;

    public void start() 
        if (thread != null) 
            throw new IllegalStateException("already running");
        
        thread = new Thread(new Runnable() 
            public void run() 
                while (!timeToDie.get()) 
                    // do_something();
                
            
        );
        thread.start();
    

    public void stop() throws InterruptedException 
        timeToDie.set(true);
        thread.join();
        thread = null;
    

【讨论】:

以上是关于如何在一定时间到期后立即停止线程? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何让 JS onkeyup事件停止一定事件后执行某个操作

如何在一段时间后停止正在运行的方法执行? [复制]

pythony中子进程如果一定时间不结束就停止应该如何做?

SwiftUI,如何在拖动后立即通过代码停止列表滚动?

如何在android中安全地停止线程? [复制]

如何在异常发生后立即停止执行函数? [Python]