有没有一种方法可以在java中执行计时器而不创建单独的线程?

有没有一种方法可以在java中执行计时器而不创建单独的线程?,java,multithreading,Java,Multithreading,在这种情况下,我需要为当前正在执行的线程每1秒递增一个线程局部变量。例如,考虑下面的代码片段 public class DemoApplication { public static final ThreadLocal<Integer> threadTest = new ThreadLocal<Integer>() { @Override protected Integer initialValue() {

在这种情况下,我需要为当前正在执行的线程每1秒递增一个线程局部变量。例如,考虑下面的代码片段

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");
            }
        }
    }
}
公共类演示应用程序{
公共静态最终线程本地线程测试=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回1;
}
};
公共静态void main(字符串[]args){
定时器=新定时器();
timer.schedule(新的timerTask(),0,1000);
DummyApplication2 DM2=新的DummyApplication2();
DM2.start();
while(true){
试一试{
System.out.println(“主线程测试值”+threadTest.get());
《睡眠》(2000年);
}
}捕捉(中断异常e){
System.out.println(“主线程中断”);
}
}
}
}
类timerTask扩展了timerTask{
私有整数i=0;
公开募捐{
DemoApplication.threadTest.set(一);
i+=1;
}
}
类DummyApplication2扩展了线程{
公开募捐{
while(true){
试一试{
睡眠(1000);
System.out.println(“第二个线程测试值”+DemoApplication.threadTest.get());
}捕捉(中断异常e){
System.out.println(“被中断的异常”);
}
}
}
}
上面的代码创建了两个线程,还创建了一个计时器,它每1秒执行一个计划任务

但是,对于上述情况,由于
timerTask
是在一个单独的线程上执行的,因此对于仍在运行的其他两个线程,它不会增加线程本地计数器
threadTest
。解决这个问题的一种方法是迭代可用的正在运行的线程列表,但是如果线程数量持续增加,我不确定这会有多高效(同样,结果也不正确,因为在上面的代码
DemoApplication2
class中,线程局部变量的增量应该是主线程的两倍,因为它的休眠时间只有主线程的一半)

所以我想知道是否有任何方法可以创建一个计时器,它可以在当前正在执行的线程中运行,而不是在它自己的线程中运行

这方面的任何帮助都会很好,谢谢

所以我想知道是否有任何方法可以创建一个可以 在当前正在执行的线程中运行,而不是在它自己的线程中运行

没有

但是,您可以记录开始时间,然后检查线程中的当前时间,以查看经过了多少时间。与其说是计时器,不如说是时钟。然后,当您关心该值时,只需查看时间并计算它应该是什么


您也可以在本地启动计时器线程,这样它就可以直接访问变量并直接更新它。因此,线程1启动线程2,线程2启动线程3,更新线程2中的值。但是,通常睡眠线程不是计时的好方法。

一个解决方案是每秒钟运行一个守护进程线程并检查线程是否正在运行并更新增量编号。对于此解决方案,您需要使用包装器管理或由线程工厂创建,可以为线程提供唯一的名称或id,并将其用作密钥,同时守护进程线程更新计数。对于存储,您可以使用诸如Map之类的键值数据结构


优化上述解决方案您创建的每个线程都会传递一个具有start和end方法的侦听器类。当线程启动时,它会通知将启动一个metrics的metrics类递增直到stop方法调用。当线程停止时,它会调用end方法。所以您可以动态地计算递增。

为什么不将递增和计时器合并到一个线程?请以大写字母开头
类的名称!!如果它是线程本地的,那么更新它又有什么关系呢。在你需要它之前。检查时钟,这段时间已经过去了多少1秒。假设变量是这样说的。@AngelKoh我不确定我是否理解,你能详细说明或给出一个答案吗example@BahramdunAdilinde伊迪明白你的意思了,我会试试看