最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的定時(shí)器和多線程

 更新時(shí)間:2024年01月16日 10:22:47   作者:羅思洋  
這篇文章主要介紹了java中的定時(shí)器和多線程用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

定時(shí)器和多線程

1、任務(wù)簡(jiǎn)介

本文分享的是杜老師《工程訓(xùn)練》任務(wù)2.3中的普通任務(wù),通過(guò)該任務(wù)我們可以初步學(xué)習(xí)Java中定時(shí)器與多線程的相關(guān)知識(shí),該任務(wù)我是在5月完成的,但是一直未將該部分任務(wù)上傳,故今天對(duì)該部分任務(wù)的學(xué)習(xí)進(jìn)行敘述,詳細(xì)的思路和代碼在下文中進(jìn)行分享。

2、基本任務(wù)和代碼

(1)任務(wù)1

  • 1)任務(wù)內(nèi)容

完成一個(gè)java application應(yīng)用程序,使用定時(shí)器編程,在實(shí)時(shí)顯示當(dāng)前時(shí)間,每1秒時(shí)鐘內(nèi)容更新一次。

  • 2)任務(wù)代碼

我首先需要了解java定時(shí)器的作用,在應(yīng)用開發(fā)中,經(jīng)常需要一些周期性的操作,比如每5分鐘執(zhí)行某一操作等,對(duì)于這樣的操作最方便、高效的實(shí)現(xiàn)方式就是使用java.util.Timer工具類,即使用java定時(shí)器,其中Timer有兩個(gè)核心的屬性,一個(gè)是TaskQueue對(duì)象,用于存儲(chǔ)任務(wù)隊(duì)列,一個(gè)是TimerThread,用于執(zhí)行隊(duì)列中的任務(wù);

要運(yùn)行一個(gè)定時(shí)任務(wù),最基本的步驟如下:首先建立一個(gè)要執(zhí)行的任務(wù)TimerTask,然后創(chuàng)建一個(gè)Timer實(shí)例,通過(guò)Timer提供的schedule()方法,將 TimerTask加入到定時(shí)器Timer中,同時(shí)設(shè)置執(zhí)行的規(guī)則即可,當(dāng)程序執(zhí)行了Timer初始化代碼后,Timer定時(shí)任務(wù)就會(huì)按照設(shè)置去執(zhí)行;

對(duì)于Timer中的schedule()方法及其語(yǔ)句的詳解

如下圖所示:

這里寫圖片描述

對(duì)于系統(tǒng)當(dāng)前時(shí)間的定義方法在任務(wù)1.3中已經(jīng)學(xué)習(xí)過(guò)了,可以借鑒任務(wù)1.3的格式來(lái)定義當(dāng)前的系統(tǒng)時(shí)間,在對(duì)Timer方法進(jìn)行了簡(jiǎn)單的學(xué)習(xí)之后,我準(zhǔn)備使用Myeclipse編寫程序來(lái)實(shí)現(xiàn)任務(wù)所要求的功能

代碼如下:

//每1S刷新顯示當(dāng)前系統(tǒng)時(shí)間
import java.text.SimpleDateFormat;//導(dǎo)入java.text包下的SimpleDateFormat類
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
//import java.util.*;//導(dǎo)入java.util包下的所有類
public class Timer1 {//類名
    public static void main(String[] args){//程序主函數(shù)
        Timer time=new Timer();//創(chuàng)建一個(gè)Timer類的實(shí)例
        MyTask task=new MyTask();//創(chuàng)建一個(gè)MyTask類的實(shí)例
        time.schedule(task, 0,1000);//指定無(wú)延遲的運(yùn)行,并且刷新時(shí)間為1S
    }
}
class MyTask extends TimerTask{//創(chuàng)建一個(gè)MyTask類繼承于父類TimerTask
    public void run(){//run方法,里面包含需要執(zhí)行的任務(wù)
        SimpleDateFormat simpleDateFormat=null;//初始化當(dāng)前時(shí)間
        //獲取當(dāng)前時(shí)間信息,并定義其格式
        SimpleDateFormat t=new SimpleDateFormat("yyyy-MM-dd"+"  "+"HH:mm:ss");
        String a=t.format(new Date());//將當(dāng)前時(shí)間信息賦給變量a
        System.out.println("當(dāng)前系統(tǒng)時(shí)間為:"+a);//輸出當(dāng)前時(shí)間信息
    }
}
  • 3)運(yùn)行結(jié)果

(2)任務(wù)2

  • 1)任務(wù)內(nèi)容

完成一個(gè)java application應(yīng)用程序,在應(yīng)用程序主進(jìn)程中新開一個(gè)線程,此線程進(jìn)行死循環(huán),每1秒被激活一次,激活時(shí)即在輸出顯示當(dāng)前時(shí)間。

  • 2)任務(wù)代碼:

在對(duì)定時(shí)器的知識(shí)進(jìn)行學(xué)習(xí)之后,我們需要學(xué)習(xí)java中多線程的知識(shí),Java 給多線程編程提供了內(nèi)置的支持,一條線程指進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù),用多線程只有一個(gè)目的,那就是更好的利用CPU的資源,而每一個(gè)線程都有自己的生命周期,如下圖所示:

Java 提供了三種創(chuàng)建線程的方法:

1、通過(guò)實(shí)現(xiàn) Runnable 接口;

2、通過(guò)繼承 Thread 類本身;

3、通過(guò) Callable 和 Future 創(chuàng)建線程;我本次編寫程序選擇使用繼承Thread 類創(chuàng)建線程,每隔1S激活一次,并顯示當(dāng)前的系統(tǒng)時(shí)間,程序代碼如下:

import java.text.SimpleDateFormat;//導(dǎo)入java.text包下的SimpleDateFormat類
import java.util.Date;//導(dǎo)入java.util包下的Date類
public class Timer2 {//類名
    public static void main(String[] args) {//程序主函數(shù)
        Thread t=new Thread();//創(chuàng)建一個(gè)新的線程
        date d=new date();//創(chuàng)建一個(gè)date類對(duì)象
        d.start();//開啟線程
    }
}
class date extends Thread{//創(chuàng)建一個(gè)date類繼承于父類Thread
    public void run(){//run方法,里面包含需要執(zhí)行的任務(wù)
        while (true){//定義死循環(huán)
            try{//try代碼塊,當(dāng)發(fā)生異常時(shí)會(huì)轉(zhuǎn)到catch代碼塊中
                Thread.sleep(1000);//死循環(huán)中的線程每隔一秒激活一次
                SimpleDateFormat simpleDateFormat=null;//初始化當(dāng)前時(shí)間
                //獲取當(dāng)前時(shí)間信息,并定義其格式
                SimpleDateFormat d=new SimpleDateFormat("yyyy-MM-dd"+"  "+"HH:mm:ss");
                String a=d.format(new Date());//將當(dāng)前時(shí)間信息賦給變量a
                System.out.println("當(dāng)前系統(tǒng)時(shí)間為:"+a);//輸出當(dāng)前時(shí)間信息
            }
            catch(InterruptedException e){//當(dāng)try代碼塊有異常時(shí)轉(zhuǎn)到catch代碼塊
            }
        }
    }
}
  • 3)運(yùn)行結(jié)果

(3)任務(wù)3

  • 1)任務(wù)內(nèi)容

完成一個(gè)java application應(yīng)用程序,此應(yīng)用程序公共類有一個(gè)double型類屬性(變量)x,初始值為0;在應(yīng)用程序主進(jìn)程中新開兩個(gè)線程,這兩個(gè)線程都進(jìn)行死循環(huán);第1個(gè)線程每隔300ms激活一次,令類屬性x自加1.0并輸出顯示;第2個(gè)線程每隔400ms激活一次,令類屬性x自加0.1并輸出顯示。

  • 2)任務(wù)代碼

前一個(gè)步驟中只使用了一個(gè)線程來(lái)執(zhí)行任務(wù),而在本步驟中需要?jiǎng)?chuàng)建兩個(gè)線程來(lái)同時(shí)執(zhí)行任務(wù),故真正需要使用到多線程的知識(shí),分別對(duì)兩個(gè)線程進(jìn)行定時(shí),并在每次激活后對(duì)x進(jìn)行輸出,并且在指定時(shí)間間隔后輸出一次x的值;

對(duì)于該程序中的兩個(gè)線程我需要分別通過(guò)Runnable接口來(lái)創(chuàng)建,并使它們?cè)谝?guī)定的激活間隔后輪流對(duì)x進(jìn)行加法操作,并在每次操作后都要輸出x的值,其中需要使用語(yǔ)句Thread a=new Thread(new AThread());來(lái)分別創(chuàng)建新的線程類,程序代碼如下所示:

public class Timer3{//類名
   static double x=0; //定義一個(gè)浮點(diǎn)型變量并賦值
   public static void main(String[] args){//程序主函數(shù)
       Thread a=new Thread(new AThread());//建立一個(gè)新的線程的對(duì)象,這里只能引用靜態(tài)的方法
       Thread b=new Thread(new BThread());//建立一個(gè)新的線程的對(duì)象,這里只能引用靜態(tài)的方法
       System.out.println("初值:"+x);//輸出浮點(diǎn)型變量x的初值
       a.start();//開啟線程a
       b.start();//開啟線程b
       }
public static class AThread implements Runnable{//通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類
    public void run(){//run方法,里面包含需要執(zhí)行的任務(wù)
        try{//try代碼塊,當(dāng)發(fā)生異常時(shí)會(huì)轉(zhuǎn)到catch代碼塊中
            while(true){//定義死循環(huán)
                Thread.sleep(300);//死循環(huán)中的線程每300ms激活一次
                x+=1;//x=x+1
                System.out.println("線程1:"+x);//在控制臺(tái)輸出x
                }
            }
        catch(InterruptedException e){}//當(dāng)try代碼塊有異常時(shí)轉(zhuǎn)到catch代碼塊
        }
    }
public static class BThread implements Runnable{//通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類
    public void run(){//run方法,里面包含需要執(zhí)行的任務(wù)
        try{//try代碼塊,當(dāng)發(fā)生異常時(shí)會(huì)轉(zhuǎn)到catch代碼塊中
            while(true){//定義死循環(huán)
                Thread.sleep(400);//死循環(huán)中的線程每400ms激活一次
                x+=0.1;//x=x+0.1
                System.out.println("線程2:"+x);//在控制臺(tái)輸出x
                }
            }
        catch(InterruptedException e){}//當(dāng)try代碼塊有異常時(shí)轉(zhuǎn)到catch代碼塊
        }
    }
}
  • 3)運(yùn)行結(jié)果

總結(jié)

本文簡(jiǎn)單介紹了Java中定時(shí)器和多線程編程的一些例子,大家可以在普通任務(wù)的基礎(chǔ)上嘗試進(jìn)行挑戰(zhàn)任務(wù),特別是將普通任務(wù)3修改為挑戰(zhàn)任務(wù)1。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • SpringBoot?@Configuration與@Bean注解使用介紹

    SpringBoot?@Configuration與@Bean注解使用介紹

    這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手
    2022-10-10
  • Java?Map循環(huán)遍歷的7種方式與性能對(duì)比

    Java?Map循環(huán)遍歷的7種方式與性能對(duì)比

    這篇文章主要為大家詳細(xì)介紹了Java中Map的七種遍歷方式,包括entrySet+for-each,keySet+for-each,只遍歷value,Iterator+entrySet等,文內(nèi)分析了每種方式的優(yōu)缺點(diǎn)和適用場(chǎng)景,希望的可以了解下
    2026-05-05
  • Java實(shí)現(xiàn)NIO聊天室的示例代碼(群聊+私聊)

    Java實(shí)現(xiàn)NIO聊天室的示例代碼(群聊+私聊)

    這篇文章主要介紹了Java實(shí)現(xiàn)NIO聊天室的示例代碼(群聊+私聊),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • java Scanner類的使用示例代碼

    java Scanner類的使用示例代碼

    這篇文章主要介紹了java Scanner類的使用,Scanner類還可以任意地對(duì)字符串和基本類型(如int和double)的數(shù)據(jù)進(jìn)行分析。借助于Scanner,可以針對(duì)任何要處理的文本內(nèi)容編寫自定義的語(yǔ)法分析器,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 深入淺出了解happens-before原則

    深入淺出了解happens-before原則

    一提到happens-before原則,就讓人有點(diǎn)“丈二和尚摸不著頭腦”。這個(gè)涵蓋了整個(gè)JMM中可見性原則的規(guī)則,究竟如何理解,把我個(gè)人一些理解記錄下來(lái)。下面可以和小編一起學(xué)習(xí)
    2019-05-05
  • Java中的xxl-job調(diào)度器線程池工作機(jī)制

    Java中的xxl-job調(diào)度器線程池工作機(jī)制

    xxl-job通過(guò)快慢線程池分離短時(shí)與長(zhǎng)時(shí)任務(wù),動(dòng)態(tài)降級(jí)超時(shí)任務(wù)至慢池,結(jié)合異步觸發(fā)和資源隔離機(jī)制,提升高頻調(diào)度的性能與穩(wěn)定性,支撐高并發(fā)場(chǎng)景下的可靠任務(wù)執(zhí)行,本文給大家介紹Java: xxl-job調(diào)度器線程池工作機(jī)制,感興趣的朋友一起看看吧
    2025-07-07
  • 深入理解@component與@Configuration注解

    深入理解@component與@Configuration注解

    這篇文章主要介紹了深入理解@component與@Configuration注解,從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法,這些方法將會(huì)被掃描,并用于構(gòu)建bean定義,初始化Spring容器,需要的朋友可以參考下
    2023-11-11
  • 你都理解創(chuàng)建線程池的參數(shù)嗎?

    你都理解創(chuàng)建線程池的參數(shù)嗎?

    這篇文章主要介紹了創(chuàng)建線程池參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Springboot實(shí)例講解實(shí)現(xiàn)專業(yè)材料認(rèn)證管理系統(tǒng)流程

    Springboot實(shí)例講解實(shí)現(xiàn)專業(yè)材料認(rèn)證管理系統(tǒng)流程

    這是一個(gè)基于java的畢業(yè)設(shè)計(jì)項(xiàng)目,畢設(shè)課題為springboot框架的知識(shí)產(chǎn)權(quán)服務(wù)平臺(tái)系統(tǒng),是一個(gè)采用b/s結(jié)構(gòu)的javaweb項(xiàng)目,需要的朋友可以參考下
    2022-06-06
  • java讀取excel文件為base64實(shí)現(xiàn)方式

    java讀取excel文件為base64實(shí)現(xiàn)方式

    文章介紹使用ApachePOI和EasyExcel處理Excel文件并轉(zhuǎn)換為Base64的方法,強(qiáng)調(diào)EasyExcel適合大文件且內(nèi)存占用低,需注意文件格式支持、流關(guān)閉、Base64編碼方式選擇及常見問(wèn)題處理,如亂碼、文件損壞等,同時(shí)建議優(yōu)化性能時(shí)采用分塊讀取
    2025-09-09

最新評(píng)論

融水| 永川市| 定兴县| 龙胜| 宁乡县| 景德镇市| 高碑店市| 洛浦县| 普定县| 宁津县| 广灵县| 兰考县| 洞口县| 南郑县| 马关县| 申扎县| 紫金县| 江陵县| 改则县| 丹江口市| 本溪市| 静乐县| 南投县| 恭城| 苗栗市| 伊川县| 理塘县| 龙岩市| 犍为县| 德庆县| 南郑县| 韩城市| 宜君县| 辽中县| 凤翔县| 长武县| 淮安市| 建水县| 南溪县| 会昌县| 蓝田县|