java任务超时

由于未提供博客具体内容,无法生成包含关键信息的摘要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.time.Duration;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.junit.jupiter.api.Test;

public class TimeOutTest {
	@Test
	public void testTaskOunt001() {
		TaskTimerProxy timeTask = new TaskTimerProxy(new DefaultTask(Duration.ofMillis(2000)), Duration.ofMillis(1000));
		DefaultTimeOutMonitor monitor = new DefaultTimeOutMonitor();
		TaskTimeOutListener listener = timeTask.getTaskTimeOutListener();
		monitor.register(listener);
		ExecutorService executorService = Executors.newFixedThreadPool(4);
		executorService.submit(monitor);
		executorService.submit(timeTask);
		for (int i = 0; i < 100; i++) {
			System.out.println(listener.isTimeOut() + " " + listener.hasEnd());
		}
		try {
			Thread.currentThread().join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

interface TaskTimer {
	void start();

	void setTimeOut(Duration duration);

	void end();

	boolean isTimeOut();

	void reset();

	boolean hasEnd();

	boolean hasStart();
}

interface TimeOutListener {
	public void onTimeOut();

	public void onEnd();
}

interface TaskTimeOutListener extends TaskTimer, TimeOutListener {

}

interface TimeOutMonitor {
	void register(TaskTimeOutListener listener);

	void unregister(TaskTimeOutListener listener);
}

class DefaultTimeOutMonitor implements TimeOutMonitor, Runnable {
	ConcurrentLinkedDeque<TaskTimeOutListener> listeners = new ConcurrentLinkedDeque<>();

	@Override
	public void register(TaskTimeOutListener listener) {
		listeners.add(listener);
	}

	@Override
	public void unregister(TaskTimeOutListener listener) {
		listeners.remove(listener);
	}

	@Override
	public void run() {
		while (true) {
			try {
				for (TaskTimeOutListener listener : listeners) {
					if (listener.hasEnd()) {
						listener.onEnd();
						listeners.remove(listener);
					} else if (listener.isTimeOut()) {
						listener.onTimeOut();
						listeners.remove(listener);
					}
				}
				try {
					TimeUnit.MILLISECONDS.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}

}

abstract class AbstractTaskTimer implements TaskTimeOutListener {
	protected Long startTime;
	protected Long endTime;
	protected Duration timeOut;
	protected volatile boolean isEnd = false;

	public AbstractTaskTimer() {
		super();
	}

	public void setDuration(Duration timeOut) {
		this.timeOut = timeOut;
	}

	public AbstractTaskTimer(Duration timeOut) {
		super();
		this.timeOut = timeOut;
	}

	@Override
	public void start() {
		startTime = System.currentTimeMillis();
	}

	@Override
	public void setTimeOut(Duration timeOut) {
		this.timeOut = timeOut;
	}

	@Override
	public void end() {
		endTime = System.currentTimeMillis();
		System.out.println("end task use time:" + (endTime - startTime));
		isEnd = true;
	}

	public boolean hasEnd() {
		return isEnd;
	}

	@Override
	public boolean isTimeOut() {
		if (startTime == null)
			return false;
		return startTime + timeOut.toMillis() < System.currentTimeMillis();
	}

	@Override
	public void reset() {
		startTime = System.currentTimeMillis();
	}

	@Override
	public boolean hasStart() {
		return startTime == null;
	}
}

class DefaultTaskTimer extends AbstractTaskTimer {
	public DefaultTaskTimer() {
		super();
	}

	public DefaultTaskTimer(Duration timeOut) {
		super(timeOut);
	}

	@Override
	public void onTimeOut() {
		System.err.println("timeOut:" + isTimeOut() + " hasEnd:" + hasEnd());
	}

	@Override
	public void onEnd() {
		System.err.println("timeOut:" + isTimeOut() + " hasEnd:" + hasEnd() + " use time" + (endTime - startTime));
	}

}

class TaskTimerProxy implements Runnable {
	Runnable task;
	TaskTimeOutListener taskTimer;

	public TaskTimerProxy(Runnable task) {
		this.task = task;
	}

	public TaskTimerProxy(Runnable task, Duration timeOut) {
		this.task = task;
		taskTimer = new DefaultTaskTimer(timeOut);
	}

	public void setTaskTimer(TaskTimeOutListener taskTimer) {
		this.taskTimer = taskTimer;
	}

	public TaskTimeOutListener getTaskTimeOutListener() {
		return this.taskTimer;
	}

	@Override
	public void run() {
		if (taskTimer == null) {
			throw new Error("task timer not set");
		}
		taskTimer.start();
		task.run();
		taskTimer.end();
	}

}

class DefaultTask implements Runnable {
	private Duration sleepDuration;

	DefaultTask(Duration sleepDuration) {
		this.sleepDuration = sleepDuration;
	}

	@Override
	public void run() {
		try {
			Thread.sleep(sleepDuration);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值