多线程导致数据重复添加

20 篇文章 0 订阅
4 篇文章 0 订阅

多线程有序执行的方法!!参考 https://blog.csdn.net/Jae_Wang/article/details/80399730
多线程和线程池的总结以及常见的面试问题:https://blog.csdn.net/tianmi1988/article/details/51334299
1.测试用例

 @Test
    public void testthread() throws InterruptedException {
        List<String> list = new ArrayList<>();
        
        list.clear();
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                list.add("yura");
                System.out.println("list"+list);
            }
        });
        t1.start();
//        t1.join();

        list.clear();
        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                list.add("yura");
                System.out.println("list"+list);
            }
        });
        t2.start();
        //t2.join();
        }

输出结果:list[yura] list[yura,yura]
注意:list.clear()方法不论写在线程里还是外,都会出现数据重复添加的问题,此测试用例过于简单,无法重现list.clear()方法写在线程里出现重复添加的现象,项目中出现过
2.每次启动后添加join即可解决 :输出结果list[yura] list[yura]但是要注意性能影响,一般不推荐使用
3.使用线程池:

@Test
    public void testthread() throws InterruptedException {
        List<String> list = new ArrayList<>();
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                list.clear();
                list.add("yura");
                System.out.println("list"+list);
            }
        });
//        t1.start();
//        t1.join();

        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                list.clear();
                list.add("yura");
                System.out.println("list"+list);
            }
        });
//        t2.start();
//        t2.join();
        ExecutorService exec = Executors.newSingleThreadExecutor(); //创建一个单线程化的线程池
        exec.submit(t1);
        exec.submit(t2);
        exec.shutdown();// 关闭线程池 
        }

输出结果:list[yura] list[yura]
注意:使用线程池的时候list.clear()需要写在线程里面
4.扩展:线程池的好处和应用 https://blog.csdn.net/qq_38729449/article/details/79452898

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以使用线程库`threading`来实现多线程,并通过`Timer`类实现定时任务。代码示例如下: ``` import threading import time def task(): print("Task executed") timer = threading.Timer(5, task) # 5s后执行任务 timer.start() ``` 上面代码中,首先导入了`threading`库,然后定义了一个名为`task`的函数,表示任务内容。最后,使用`Timer`类,并将其初始化为5s后执行任务,最后调用`start()`方法开始执行任务。 ### 回答2: 在Python中,要实现多线程定时任务,可以使用`threading`模块的`Timer`类来实现。`Timer`类可以在指定的时间后执行指定的函数。 以下是一个简单的示例代码: ```python import threading import time def task(): print("定时任务执行的函数") def schedule_task(): # 创建一个定时器,延迟5秒后执行任务 timer = threading.Timer(5, task) timer.start() # 调用函数来进行定时任务 schedule_task() # 在任务执行期间,程序可以继续执行其他操作 print("程序继续执行") ``` 输出结果为: ``` 程序继续执行 定时任务执行的函数 ``` 在上面的示例中,`schedule_task`函数用于创建定时器,并指定执行的时间和函数。`Timer`类的第一个参数是延迟的时间(以秒为单位),第二个参数是要执行的函数。`start`方法用于启动定时器。在定时器到期后,会调用指定的函数进行任务的执行。 需要注意的是,`Timer`类一旦启动,就会占用一个线程,所以在实际应用中要根据需要合理使用多线程,避免线程过多导致性能问题。 此外,Python还提供了其他的多线程模块和库,例如`multiprocessing`模块、`concurrent.futures`等,可以根据具体需求选择合适的方式来实现多线程定时任务。 ### 回答3: 在Python中实现多线程定时任务可以使用`threading`模块和`time`模块的`sleep()`函数结合使用。 首先,导入所需要的模块: ```python import threading import time ``` 然后,定义一个函数,作为需要重复执行的任务: ```python def task(): # 任务的具体逻辑 print("执行定时任务") ``` 接下来,定义一个函数,用于重复执行任务并设置定时时间: ```python def repeatTask(interval): while True: task() # 执行任务 time.sleep(interval) # 暂停一段时间 ``` 最后,在主程序中创建一个线程,并启动该线程: ```python if __name__ == "__main__": interval = 5 # 定时时间间隔,单位为秒 t = threading.Thread(target=repeatTask, args=(interval,)) t.start() ``` 在上述代码中,我们将`repeatTask()`函数作为线程的目标函数,并将定时时间间隔作为参数传递给`repeatTask()`函数。通过调用`start()`方法启动线程,线程会按照指定的时间间隔重复执行任务。 需要注意的是,如果在任务执行过程中遇到了异常,线程将会终止,这会导致定时任务停止。如果需要处理异常情况,可以在`task()`函数中添加异常处理逻辑。 此外,还需要注意线程之间共享数据的问题,可以使用`threading.Lock()`来保证线程安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值