线程的结束

如何优雅地结束一个线程

  结束一个线程最好的方式,是让其执行完业务逻辑之后,自动地结束。但是有时候可能无法达到这种理想的状态,比如一个正在上传大文件的线程,当我们要取消这个操作的时候,就需要手动地结束这个线程。保证线程执行的中间状态不丢失以及保证数据的一致性是结束一个线程的时候需要关注的问题。

volatile结束线程

public class TestThread {
    private static volatile boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            long i = 0L;
            while (running) {
                i++;
            }
            System.out.println("t1 end, i = " + i);
        });
        t1.start();
        Thread.sleep(1000);
        running = false;
    }
}

  一个线程可以通过监控一个volatile变量来结束线程,当监控到volatile改变的时候,可以做一些保存中间状态的操作等善后工作。

interrupt结束线程

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(() -> {
        long i = 0L;
        while (!Thread.interrupted()) {
            i++;
        }
        System.out.println("t1 end, i = " + i);
    });
    t1.start();
    Thread.sleep(1000);
    t1.interrupt();
}

  通过interrupt()方法也可以达到类似于volatile的效果。不同之处在于interrupt方法修改的是线程本身的一个标志位,而volatile修改的是一个共享变量。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QThread线程结束时,可以通过以下几种方式进行处理: 1. 使用QThread的finished信号:在QThread的子类中,可以重写其finish函数,在该函数中发送finished信号。在主线程中,连接finished信号到相应的槽函数,以执行线程结束后的操作。 示例代码如下所示: ```python from PyQt5.QtCore import QThread, pyqtSignal class MyThread(QThread): finished = pyqtSignal() def __init__(self): super().__init__() def run(self): # 线程执行的任务 self.finished.emit() # 主线程中使用示例 def on_thread_finished(): # 线程结束后的操作 pass thread = MyThread() thread.finished.connect(on_thread_finished) thread.start() ``` 2. 使用QThread的wait函数:在主线程中,可以调用线程对象的wait函数,等待线程执行完毕后再进行下一步操作。 示例代码如下所示: ```python from PyQt5.QtCore import QThread class MyThread(QThread): def __init__(self): super().__init__() def run(self): # 线程执行的任务 # 主线程中使用示例 thread = MyThread() thread.start() thread.wait() # 线程结束后的操作 ``` 3. 使用QThread的quit和wait函数:在线程执行完任务后,可以调用线程对象的quit函数退出线程事件循环,并使用wait函数等待线程执行完毕后再进行下一步操作。 示例代码如下所示: ```python from PyQt5.QtCore import QThread class MyThread(QThread): def __init__(self): super().__init__() def run(self): # 线程执行的任务 # 主线程中使用示例 thread = MyThread() thread.start() thread.quit() thread.wait() # 线程结束后的操作 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值