簡體   English   中英

有沒有一種方法可以執行計時器而不在Java中創建單獨的線程?

[英]Is there a way to execute a timer without creating separate Thread in java?

我有一種情況,我需要為當前正在執行的線程每1秒增加一個Thread局部變量。 例如考慮以下代碼片段

public class DemoApplication {

    public static final ThreadLocal<Integer> threadTest =
        new ThreadLocal<Integer>() {
            @Override protected Integer initialValue() {
                return 1;
            }
        };

    public static void main(String[]args) {
        Timer timer = new Timer();
        timer.schedule(new timerTask(), 0, 1000);

        DummyApplication2 DM2 = new DummyApplication2();
        DM2.start();

        while(true) {
            try{
                System.out.println("main thread test value" + threadTest.get());
                Thread.sleep(2000);
            }
            }catch (InterruptedException e) {
                System.out.println("Thread interrupted in main");
            }

        }
    }
}
class timerTask extends TimerTask{

    private int i= 0;
    public void run() {
        DemoApplication.threadTest.set(i);
        i+=1;
    }
}


class DummyApplication2 extends Thread{
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                System.out.println("Second thread test value " + DemoApplication.threadTest.get());
            } catch(InterruptedException e){
                System.out.println("Got interrupted exception");
            }
        }
    }
}

上面的代碼創建了兩個線程,還創建了一個計時器,該計時器每1秒執行一次計划任務。

但是,對於上述情況,由於timerTask在單獨的線程上執行,因此不會為仍在運行的其他兩個線程增加線程本地計數器threadTest 解決此問題的一種方法是遍歷可用的正在運行的線程列表,但是我不確定如果線程數量持續增加,效率將是多少(例如,上述代碼DemoApplication2類本地線程中的結果也不正確)變量的增量應該是主線程的兩倍,因為它休眠的時間是main的一半。

因此,我想知道是否有任何方法可以創建可以在當前正在執行的線程中運行的計時器,而不是可以在其自己的線程中運行的計時器。

在這方面的任何幫助都很好,謝謝

因此,我想知道是否有任何方法可以創建可以在當前正在執行的線程中運行的計時器,而不是可以在其自己的線程中運行的計時器。

沒有。

但是,您可以記錄開始時間,然后檢查該線程中的當前時間以查看已花費了多少時間。 它不是計時器,而是時鍾。 然后,當您關心該值時,只需查看時間並計算該值即可。

您還可以在本地啟動計時器線程,以便它可以直接訪問該變量並可以直接對其進行更新。 因此,線程1啟動線程2,線程2啟動線程3,線程3更新線程2中的值。但是,通常來說,休眠線程不是計時時間的好方法。

一種解決方案是一個守護線程每秒鍾運行一次,並檢查線程是否正在運行並更新增量號。對於此解決方案,您需要由線程工廠使用包裝器來管理或創建,可以給線程賦予唯一的名稱或ID,並將其用作密鑰守護線程更新計數時,可以使用諸如Map之類的鍵值數據結構進行存儲。

針對上述解決方案進行優化:您創建的每個線程都會傳遞一個具有start和end方法的偵聽器類,當線程啟動時,它將通知度量標准類,該類將啟動計量器遞增直到停止方法調用。當線程停止時,它將調用end方法。您可以計算增量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM