欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)用開(kāi)發(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)程中新開(kāi)一個(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();//開(kāi)啟線程
    }
}
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)程中新開(kāi)兩個(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();//開(kāi)啟線程a
       b.start();//開(kāi)啟線程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中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)

    springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)

    這篇文章主要介紹了springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 關(guān)于RabbitMQ的Channel默認(rèn)線程

    關(guān)于RabbitMQ的Channel默認(rèn)線程

    這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過(guò)jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下
    2023-09-09
  • Mybatis?XML配置文件實(shí)現(xiàn)增刪改查的示例代碼

    Mybatis?XML配置文件實(shí)現(xiàn)增刪改查的示例代碼

    本文主要介紹了Mybatis?XML配置文件實(shí)現(xiàn)增刪改查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • SpringBoot時(shí)間格式化的方法小結(jié)

    SpringBoot時(shí)間格式化的方法小結(jié)

    SpringBoot中的時(shí)間格式化通常指的是將Java中的日期時(shí)間類型轉(zhuǎn)換為指定格式的字符串,或者將字符串類型的時(shí)間解析為Java中的日期時(shí)間類型,本文小編將給大家詳細(xì)總結(jié)了SpringBoot時(shí)間格式化的方法,剛興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-10-10
  • Java進(jìn)階核心之InputStream流深入講解

    Java進(jìn)階核心之InputStream流深入講解

    這篇文章主要給大家介紹了關(guān)于Java進(jìn)階核心之InputStream流的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java使用計(jì)算md5校驗(yàn)碼方式比較兩個(gè)文件是否相同

    java使用計(jì)算md5校驗(yàn)碼方式比較兩個(gè)文件是否相同

    MD5文件效驗(yàn)碼是一個(gè)判斷文件是否是相同文件的途徑,通過(guò)比較兩個(gè)文件的Md5效驗(yàn)碼是否相同來(lái)精確判斷兩個(gè)文件是否相同
    2014-04-04
  • Java?8中的18個(gè)常用日期處理(收藏)

    Java?8中的18個(gè)常用日期處理(收藏)

    伴隨lambda表達(dá)式、streams以及一系列小優(yōu)化,Java 8 推出了全新的日期時(shí)間API,這篇文章主要介紹了Java?8的18個(gè)常用日期處理,需要的朋友可以參考下
    2022-04-04
  • Java多線程中斷機(jī)制三種方法及示例

    Java多線程中斷機(jī)制三種方法及示例

    這篇文章主要介紹了Java多線程中斷機(jī)制三種方法及示例,向大家分享了這三種方法的介紹幾代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • JAVA實(shí)現(xiàn)用戶抽獎(jiǎng)功能(附完整代碼)

    JAVA實(shí)現(xiàn)用戶抽獎(jiǎng)功能(附完整代碼)

    這篇文章主要給大家介紹了關(guān)于JAVA實(shí)現(xiàn)用戶抽獎(jiǎng)功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 基于parameters參數(shù)實(shí)現(xiàn)參數(shù)化過(guò)程解析

    基于parameters參數(shù)實(shí)現(xiàn)參數(shù)化過(guò)程解析

    這篇文章主要介紹了基于parameters參數(shù)實(shí)現(xiàn)參數(shù)化過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論