亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中的定時器和多線程

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

定時器和多線程

1、任務(wù)簡介

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

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

(1)任務(wù)1

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

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

  • 2)任務(wù)代碼

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

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

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

如下圖所示:

這里寫圖片描述

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

代碼如下:

//每1S刷新顯示當(dāng)前系統(tǒng)時間
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)建一個Timer類的實例
        MyTask task=new MyTask();//創(chuàng)建一個MyTask類的實例
        time.schedule(task, 0,1000);//指定無延遲的運行,并且刷新時間為1S
    }
}
class MyTask extends TimerTask{//創(chuàng)建一個MyTask類繼承于父類TimerTask
    public void run(){//run方法,里面包含需要執(zhí)行的任務(wù)
        SimpleDateFormat simpleDateFormat=null;//初始化當(dāng)前時間
        //獲取當(dāng)前時間信息,并定義其格式
        SimpleDateFormat t=new SimpleDateFormat("yyyy-MM-dd"+"  "+"HH:mm:ss");
        String a=t.format(new Date());//將當(dāng)前時間信息賦給變量a
        System.out.println("當(dāng)前系統(tǒng)時間為:"+a);//輸出當(dāng)前時間信息
    }
}
  • 3)運行結(jié)果

(2)任務(wù)2

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

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

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

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

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

1、通過實現(xiàn) Runnable 接口;

2、通過繼承 Thread 類本身;

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

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

(3)任務(wù)3

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

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

  • 2)任務(wù)代碼

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

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

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

總結(jié)

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

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

相關(guān)文章

  • springboot中的springSession的存儲和獲取實現(xiàn)

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

    這篇文章主要介紹了springboot中的springSession的存儲和獲取實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)線程,通過jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費者這邊就會創(chuàng)建一條線程,言下之意,一個channel當(dāng)消息來到時就會異步處理這些消息,需要的朋友可以參考下
    2023-09-09
  • Mybatis?XML配置文件實現(xiàn)增刪改查的示例代碼

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

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

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

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

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

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

    java使用計算md5校驗碼方式比較兩個文件是否相同

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

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

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

    Java多線程中斷機制三種方法及示例

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

    JAVA實現(xiàn)用戶抽獎功能(附完整代碼)

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

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

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

最新評論