当前位置: 首页 > news >正文

温州seo建站网站设计收费明细表

温州seo建站,网站设计收费明细表,5944免费空间上搭建网站,小程序代理项目目录 一、定时器 二、标准库中的Timer 三、代码实现 四、死锁 一、定时器 代码中的定时器通常是在一定的时间执行对应的代码逻辑 二、标准库中的Timer public static void main(String[] args){Timer timer new Timer();timer.schedule(new TimerTask() {Overridepublic…目录 一、定时器 二、标准库中的Timer 三、代码实现 四、死锁 一、定时器 代码中的定时器通常是在一定的时间执行对应的代码逻辑 二、标准库中的Timer public static void main(String[] args){Timer timer new Timer();timer.schedule(new TimerTask() {Overridepublic void run() {System.out.println(时间到了后执行业务逻辑);}},1000);} 一个timer可以执行多个定时任务后续添加任务继续调用schedule方法即可 三、代码实现 首先我们定义一个类用于描述任务 // 用于描述任务 class MyTimerTask {// 执行的任务private Runnable runnable;// 什么时间后执行绝对的时间private long time;/**** param runnable 任务* param time 多少时间后执行*/public MyTimerTask(Runnable runnable, long time) {this.runnable runnable;this.time System.currentTimeMillis() time;} } 然后我们开始定时器的编写首先我们需要一个数据结构来存储提交的定时任务这个数据结构需要能够依次取出最先执行的任务且要是线程安全的首先想到的是优先级队列其次要有阻塞功能就是阻塞队列然后我们需要定义一个提交任务的方法该方法中可以将提交的任务存入该队列中然后在构造方法中创建一个扫描线程不断地取出该队列里地任务进行执行。在此之前我们使用优先级队列是存储定时任务的那么我们可以先给上面的类实现Compareable接口重写compareTo方法 class MyTimer {// 1. 创建存储定时任务的数据结构BlockingQueueMyTimerTask queue new PriorityBlockingQueue();// 2. 定义提交定时任务的方法public void schedule(Runnable runnable,long after) throws InterruptedException {MyTimerTask task new MyTimerTask(runnable,after);queue.put(task);}// 3. 构造方法中定义扫描线程public MyTimer() {new Thread(()-{// 3.1 不断的取出数据看是否需要执行while (true) {try {// 3.1.1 拿出最先需要执行的任务判断是否到达执行时间MyTimerTask task queue.take();if (System.currentTimeMillis() task.getTime()) {// 3.1.2 到达时间执行任务task.getRunnable().run();} else {// 3.1.3 没到时间重回队列queue.put(task);}} catch (InterruptedException e) {e.printStackTrace();}}}).start();} }这个时候盲等问题就出现了比如我们提交了一个2小时后才执行的任务但是按照上述代码则在这2小时的时间里不断地从队列中取出该任务比较后重回队列那可以使用sleep2h这种方法来解决问题吗答案是不能使用sleep方法让线程挂起两个小时可以保证2小时后的任务会被执行但是如果中途有其他更早的任务提交进来那么这个任务就会错过执行的时间。那让每次sleep的时间短一点呢答案同理也是不能的。我们可以使用wait方法来实现wait(2h)然后在提交任务的方法中一但有新的任务提交调用notify唤醒wait即可如果在这两个小时内没有任务提交那么该方法还是会在2h后去执行任务。 // 2. 定义提交定时任务的方法public void schedule(Runnable runnable,long after) throws InterruptedException {MyTimerTask task new MyTimerTask(runnable,after);queue.put(task);synchronized (this) {this.notify();}}// 3. 构造方法中定义扫描线程public MyTimer() {new Thread(()-{// 3.1 不断的取出数据看是否需要执行while (true) {try {// 3.1.1 拿出最先需要执行的任务判断是否到达执行时间MyTimerTask task queue.take();if (System.currentTimeMillis() task.getTime()) {// 3.1.2 到达时间执行任务task.getRunnable().run();} else {// 3.1.3 没到时间重回队列queue.put(task);// 3.1.4 阻塞synchronized (this) {this.wait(task.getTime() - System.currentTimeMillis());}}} catch (InterruptedException e) {e.printStackTrace();}}}).start();} 这样我们就解决了盲等问题但是还有一个原子性问题就是如果此时扫描线程刚好取出了最先要执行的任务该任务是在2h后执行扫描线程在判断是否到达执行时间之前其他线程调用添加任务的方法加入了一个1h后需要执行的任务且方法执行完notify没有起到任何作用此时扫描线程判断完后发现还没有到时间于是将任务入队后调用wait方法等待2h或被唤醒刚好这2h没有其他任务加入那么之前提交的1h后的任务就会延迟执行。这是由于扫描线程中操作不是原子性的我们需要调整锁的粒度 new Thread(()-{// 3.1 不断的取出数据看是否需要执行while (true) {try {synchronized (this) {// 3.1.1 拿出最先需要执行的任务判断是否到达执行时间MyTimerTask task queue.take();if (System.currentTimeMillis() task.getTime()) {// 3.1.2 到达时间执行任务task.getRunnable().run();} else {// 3.1.3 没到时间重回队列queue.put(task);// 3.1.4 阻塞this.wait(task.getTime() - System.currentTimeMillis());}}} catch (InterruptedException e) {e.printStackTrace();}}}).start() 那么notify代码中的锁粒度是否也需要调整呢 四、死锁 如果我们将schedule方法中锁的粒度也扩大 public void schedule(Runnable runnable,long after) throws InterruptedException {synchronized (this) {MyTimerTask task new MyTimerTask(runnable,after);queue.put(task);this.notify();}} 这个时候我们进行测试会发现什么也不会执行发送了死锁。那这是为什么呢 首先MyTimer实例被创建时扫描线程开始执行当他执行到此处时会因为阻塞队列中还没有元素而阻塞等待 但是锁还是被持有此时提交任务的代码执行时发现需要先获取到锁但是锁是被扫描线程持有于是他需要阻塞等待但是扫描线程中的take方法也需要执行了提交任务方法中的put才能继续执行但是执行put方法有需要扫描线程先释放锁所以发生死锁这个时候我们需要将schedule方法中锁的粒度修改回去
http://www.w-s-a.com/news/723557/

相关文章:

  • 新公司注册网站传奇手游大型网站
  • 无极网站网站涉案多少人被抓网站的按钮怎么做
  • ds216j做网站做购物网站那个好
  • 做淘宝门头的网站阿里巴巴官网app
  • 安踏网站建设策划方案如何通过域名访问网站
  • 建设网站破解版seo查询 站长之家
  • 太原模板建站平台旅游企业网站建设工作的通知
  • 网站国外建设超级简历模板官网
  • 上海网站建设市场医药网站怎么做
  • 宁夏成城建设集团网站网店美工课本
  • 哪些网站的简历做的比较好政务服务 网站 建设方案
  • 如何建设个人网站凡科怎么样vps安装wordpress后怎样登录
  • 学seo朝阳区seo
  • 网站开发团队成员皮具网站建设
  • 国外外贸需求网站响应式布局网页
  • 手机端便民服务平台网站建设昆明网络哪家好
  • 产品网站建设找哪家舟山信息港
  • 唐山网站建设汉狮怎么样seol英文啥意思
  • 深圳小程序网站开发公司网页制作模板视频教程
  • 电子商务网站开发开题报告wordpress更改后台地址
  • 网站静态前端是什么工作
  • 餐饮门户网站 方案怎么做创业好项目
  • 做百度手机网站推广普通话的宣传标语
  • 记事本可以做网站吗网站服务器是主机吗
  • 手机网站被拦截怎么办怎么解决东营建设信息网网
  • 外贸网站模板免费微信网站开发技术
  • 视频盗版网站怎么做福州网站seo
  • 成都金铭 网站建设做网站包含的技术
  • 长沙的网站建设公司哪家好做网站应选那个主题
  • 公司网站百度搜不到如何自己做一个网站