【问题标题】:JAVA: How to stop fetching data from API when thread is interrupted?JAVA:线程中断时如何停止从 API 获取数据?
【发布时间】:2018-01-12 09:33:35
【问题描述】:

当我点击开始按钮时,我会从 twiter api 获取数据

单击取消按钮会中断线程,但我仍然从 twitter api 获取数据。

线程中断时如何停止从 twitter api 获取数据?

TryuingRunncabble 类:

public class TryuingRunabble implements Runnable {

    ConnectTwitter coT;

    @Override
    public void run() {
        // TODO Auto-generated method stub

        coT = new ConnectTwitter();
        try {
            TimeUnit.MILLISECONDS.sleep(3000);
            coT.searchtwitter();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IOException
                | TwitterException | SQLException | InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

MainControll 类:

TryuingRunabble r = new TryuingRunabble();

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

    start.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
        r.run();    
    });


    stop.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
        Thread.currentThread().interrupt();

    });

}

【问题讨论】:

    标签: java multithreading javafx runnable


    【解决方案1】:

    你需要中断运行TryuingRunabbleThread

        TryuingRunabble r = new TryuingRunabble();
        Thread t = new Thread(r);
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            // TODO Auto-generated method stub
    
            start.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
                t.start();
            });
    
    
            stop.addEventHandler(MouseEvent.MOUSE_CLICKED, (e)->{
                t.interrupt();
            });
        }
    

    【讨论】:

    • 只有当我点击开始按钮然后立即点击取消按钮时它才有效。帮忙?
    • 如果真的要杀线程,可以把t.interrupt()换成t.stop(),但是不建议这样。 @ProgrammingLycan
    • 我用 stop() 试过了,它奏效了。谢谢,但没有更有效的方法吗?
    • 如果线程处于休眠状态,可以立即中断;如果它正在处理诸如coT.searchtwitter() 之类的东西,我不知道还有其他方法可以杀死它。
    • @ProgrammingLycan 不要使用Thread.stop()。如果它正在执行的方法被编写为与取消合作,你真的只能取消一个正在运行的线程:我不知道你使用的 Twitter API 是否这样做(我不熟悉那个 API。)阅读this article关于中断线程。 (这篇文章很旧,但仍然很有用。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多