关于计时器与多线程

对于初学编程者基本使用计时器来实现重复的做一件事情。但在对于一些数据库操作方面或者对时间要求比较高的情况下,使用计时器是会出现问题的。一个简单的例子是短信提交,如果从数据库中取出数据,然后提交到网关,在给数据库标识已经提交,这个过程必须严格控制时间,计时器的时间。但即使这样偶尔还是会出现多次重复提交的情况,最终导致整个过程混乱。如果在网络好的情况下,提交一次短信需要0.1秒,你的计时器设置时间为3秒,那么这样的情况下它会正常提交,且不会出错。如果你的网络不好,提交一次突然需要等待15秒,那么你这次的短信还没有提交完毕且给数据库标识为已提交,那么在这15秒之内,你这需要提交的数据将会重复提交5次左右,这还不是最糟糕的情况。最糟糕的情况是,发生这样的情况时,往往会导致你在往数据库回写状态是发生数据库死锁现象,你的状态回写失败了。那么你这次提交的内容几乎是无线次提交,从而带来巨大的损失。

要解决此种情况个人建议使用多线程来解决。即另外开辟一个永远循环(需要的情况)的线程来重复提交数据,这样可以解决上面的情况发生。只有当一次执行完成之后才会去执行第二次。为了保证线程不会被终止,需要对执行提交的代码使用try-catch来保证一次提交出错,还是会进行第二次。至于需要停止线程,方法很多,可以去探索,提示:使用一个标识来控制循环即可。需要注意的是每次执行完成之后最后使用Thread.Sleep(3000)来等待其他程序的执行。

时间: 2024-10-29 19:07:24

关于计时器与多线程的相关文章

前端面试个人总结

# 面试题总结 ### 基础部分 1. 什么是HTML? 答: - [ ] > ?      HTML并不是真正的的程序语言,他是一种 标 记 语 言 ,用来结构化和含义化你想要放 > 在web 网站上的那些内容.它由一系列的元素(elements)所组成,这些元素可以用来 > 封装你的内容中担任不同工作的各部分和各个角色. 2. 什么是CSS? 答: - [ ] > ?      就像 HTML,CSS 也不是真正的编程语言.它是样式表语言,也就是说,它允许你有 > 选择性

JavaScript面试题(转)

JS相关问题 数组去重 function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++){ if(temp.indexOf(array[i]) == -1){ temp.push(array[i]); } } return temp; } var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5]; console.log(aa) console.log(uniq(aa)) j

C#线程 使用线程

第三部分 使用线程 基于事件的异步模式 基于事件的异步模式(EAP)提供了一种简单的方法,通过这些方法,类可以提供多线程功能,而使用者无需显式启动或管理线程.它还提供以下功能: 合作取消模型 工作人员完成时可以安全更新WPF或Windows Forms控件的功能 将异常转发到完成事件 EAP只是一种模式,因此这些功能必须由实现者编写.框架中只有少数几个类遵循此模式,最著名的是BackgroundWorker(我们将在后面介绍)以及System.Net中的WebClient.本质上,模式是这样的:

多线程之倒计时器CountDownLatch和循环栅栏CyclicBarrier

1.倒计时器CountDownLatch CountDownLatch是一个多线程控制工具类.通常用来控制线程等待,它可以让一个线程一直等待知道计时结束才开始执行 构造函数: public CountDownLatch(int count) //count 计数个数 例如:在主线程中启动10个子线程去数据库中获取分页数据,需要等到所有线程数据都返回之后统一做统计处理 public class CountDownLatchDemo implements Runnable{ private stat

多线程控制工具类--倒计时器CountDownLatch的使用(模仿火箭发射)

package com.thread.test.Lock; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CountDownLatchDemo implements Runnable { static final

java多线程制作计时器

基本思路: 在类中创建thread 供按钮监听器调用. 界面设计: 代码: 1 package thread; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 public class Threadtest extends JFrame implements Runnable{ 9 JFrame frm=new JFrame("watch"); 10 JPanel botto

多线程的实现及其安全问题

一.进程和线程概述 1.进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,简单来说开启一个程序就开启了一个进程: 如果开启多个进程,它们之间是由于CPU的时间片在相互的切换: 2.线程:开启一个进程的一个任务,对于多线程:每一个线程都在争夺CPU的执行权(CPU的执行权具有随机性): 如果一个程序的执行路径有多条,那么该线程是多线程;反之,就单线程线程:线程是依赖于进程存在的! 3.Jvm是多线程 -- 至少开启了两条线程 main方法 主线程 gc() 垃圾回收线程 二.多线程

多线程的秘密

一.线程的定义  1. 1 进程.应用程序域与线程的关系 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的.进程可以理解为一个程序的基本边界. 应用程序域(AppDomain)是一个程序运行的逻辑区域,它可以视为一个轻量级的进程,.NET的程序集正是在应用程序域中运行的

Java基础知识—多线程编程(五)

概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源,提高工作效率. 线程生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 就绪状态: 当线程对象调用了start()方法之后,该