美文网首页Java学习笔记
11.11-全栈Java笔记:线程状态转换和任务定时调度

11.11-全栈Java笔记:线程状态转换和任务定时调度

作者: 全栈JAVA笔记 | 来源:发表于2017-07-11 10:57 被阅读92次

线程状态转换

  图1 线程的状态

1)New :创建好线程对象,但没有启动的时候。

一个线程调用start()之后不一定会马上启动,此时进入就绪状态,等待得到资源。

2)就绪线程序通过Scheduler(调度程序)去确定是否运行。

3)Runing---dead:运行结束(非双向,为单向箭头)。

4)Runing---就绪:暂停(除了没有CPU,具备运行的所有条件)。

5)Runing-otherwise(阻塞):因程序原因:调用sleep或join之后,线程被阻塞。这时不具备运行的条件,此时线程进入阻塞池。sleep或join条件解除之后直接进入Runnable不进入running。

6)Lock pool:锁池状态。每个对象都有自己的锁池,锁池里放置了想获得对象锁的线程。

7)等待状态(wait pool):比如一个线程调用了某个对象的wait()方法,就进入了该对象的wait pool, 正在等待其它线程调用这个对象的notify()或者notifyAll()(这两个方法同样是继承自Object类)方法来唤醒它。

任务定时调度

通过Timer和Timetask,我们可以实现定时启动某个线程。

1)java.util.Timer

在这种实现方式中,Timer类作用是类似闹钟的功能,也就是定时或者每隔一定时间触发一次线程。其实,Timer类本身实现的就是一个线程,只是这个线程是用来实现调用其它线程的。

2)java.util.TimerTask任务类

TimerTask类是一个抽象类,该类实现了Runnable接口,所以该类具备多线程的能力。

在这种实现方式中,通过继承TimerTask使该类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。 

【示例1java.util.Timer的使用

public class TestTimer {

    public static void main(String[] args) {

       Timer t1 = new Timer();

       MyTask task1 = new MyTask();

//     t1.schedule(task1,3000);  //3秒后执行

       t1.schedule(task1,5000,1000);  //5秒以后每隔1秒执行一次!

//     GregorianCalendar   calendar1 = new GregorianCalendar(2010,0,5,14,36,57);  //注意月份是0-11

//     t1.schedule(task1,calendar1.getTime());  //指定时间定时执行

    }

}

class MyTask extends    TimerTask {

    public void run() {

       for(int i=0;i<100;i++){

           System.out.println("任务1:"+i);

       }

    }

}

在实际使用时,一个Timer可以启动任意多个TimerTask实现的线程,但是多个线程之间会存在阻塞。所以如果多个线程之间如果需要完全独立运行的话,最好还是一个Timer启动一个TimerTask实现。

老鸟建议

实际开发中,我们可以使用开源框架quanz,更加方便的实现任务定时调度。实际上,quanz底层原理就是我们这里介绍的内容。


「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。

 笔记包含从浅入深的六大部分:

 A-Java入门阶段

 B-数据库从入门到精通

 C-手刃移动前端和Web前端

 D-J2EE从了解到实战

 E-Java高级框架精解

 F-Linux和Hadoop 

相关文章

  • 11.11-全栈Java笔记:线程状态转换和任务定时调度

    线程状态转换 图1线程的状态 1)New :创建好线程对象,但没有启动的时候。 一个线程调用start()之后不一...

  • Java定时任务调度工具详解

    本篇内容:什么是定时任务调度?Java定时任务调度工具详解之 Timer篇Java定时任务调度工具详解之 Quar...

  • Timer源码分析

    Timer是java.util包下jdk自带的一个定时调度类,会在主线程之外另起一个线程来执行所有的定时任务,任务...

  • ScheduledThreadPoolExecutor中的sch

    我们在开发中经常有定时调度某一个任务的需求,在java中常用的是通过定时调度线程池ScheduledThreadP...

  • Java 线程的七种状态

    本篇感性地介绍一下 Java 线程的七种状态以及状态之间的转换 Java 线程状态转换图 Java 线程状态 在 ...

  • Java中的任务调度

    任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。 Java中几种任务调度方式 Timer S...

  • JAVA定时任务

    java 中采用ScheduledExecutorService来进行定时任务调度。ScheduledExecut...

  • Java多线程与Android多线程

    Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使...

  • Java定时任务工具详解之Timer篇

    Java定时任务调度工具详解 什么是定时任务调度? ◆ 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行...

  • Java中的任务调度

    前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。本文介绍前两种任务调度的 Java 实...

网友评论

    本文标题:11.11-全栈Java笔记:线程状态转换和任务定时调度

    本文链接:https://www.haomeiwen.com/subject/iaiphxtx.html