1. 场景描述
举个例子,有时候执行一段程序需要1 ~ 10分钟才能运行完,但你最多只能等5分钟。如果5分钟以内程序能够运行完,那么直接返回正确结果;如果过了5分钟程序还没运行完,那么就中止程序的运行,直接返回一个错误结果。
2. 一个工具类(用来执行有时间限制的任务)
package org.demo.task;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class TimeoutTaskUtils {
/**
* 执行一个有时间限制的任务
* @param task 待执行的任务
* @param seconds 超时时间(单位: 秒)
* @return
*/
public static Boolean execute(Callable<Boolean> task, int seconds)
{
Boolean result = Boolean.FALSE;
ExecutorService threadPool = Executors.newCachedThreadPool();
try
{
Future<Boolean> future = threadPool.submit(task);
result = future.get(seconds, TimeUnit.SECONDS);
}
catch (Exception e)
{
result = Boolean.FALSE;
e.printStackTrace();
}
finally
{
threadPool.shutdownNow();
}
return result;
}
}
3. 测试package org.demo.task;
import java.util.concurrent.Callable;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
boolean result = TimeoutTaskUtils.execute(new MyTimeoutTask(), 5);
System.out.println("result = " + result);
System.out.println("-- finished. --");
}
}
class MyTimeoutTask implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
for (int i=0; i<10; i++) {
System.out.println("i = " + i);
Thread.sleep(1000);
}
return true;
}
}
分享到:
相关推荐
为任务设置时限是另一种重要的控制机制,它允许开发者限制任务的执行时间,防止某个任务无限制地占用资源。定时器和Future的get方法的超时版本都是实现这一目标的工具。 总的来说,Java并发编程实践中的任务执行是...
下面给出一段关键的逻辑代码片段,用于解释ZooKeeper如何处理会话终止的情况: ```java case OpCode.closeSession: // 不需要进行检查,因为会话到期线程已经将此操作加入队列,而无需拥有会话所有权。 // 这个...
- **等待/定时器(Timed Waiting)**:线程在等待一段时间后恢复执行。 - **终止(Terminated)**:线程执行完毕或被中断。 4. **线程同步**:在多线程环境中,为了防止数据不一致性和竞态条件,Java 提供了多种...
当线程数超过核心线程数时,多余的线程将在空闲一段时间后被销毁。 - **workQueue**:任务队列。用于存放等待执行的任务。根据不同的实现,可以选择无界队列、有界队列或是优先级队列。 - **threadFactory**:线程...
- **内置锁与监视器**:每个`synchronized`块或方法都隐含了一个监视器锁,确保同一时刻只有一个线程能执行特定代码段。 - **重入锁**:`java.util.concurrent.locks.ReentrantLock`提供了比`synchronized`更灵活...
用于存放待处理的任务,通常由一个生产者往队列中添加任务,多个消费者从队列中取出任务并处理。 **4.2 消息队列** 消息队列用于在不同的系统之间传递消息,支持发布/订阅模式,可以实现解耦和异步处理。 **4.3 ...
- 超时等待(Timed Waiting):线程在等待一段时间后会自动唤醒。 - 结束(Terminated):线程的`run()`方法执行完毕或因异常退出。 线程同步是为了避免多线程环境下的数据竞争问题,主要包括以下几种机制: 1. `...
Java通过finalize()方法提供了一种机制,允许开发者在对象不再被引用时执行清理操作,如释放外部资源等。需要注意的是,finalize()方法并不保证一定会被执行,也不建议开发者依赖此方法来确保资源释放。自Java 9起,...
- **sleep()**:使当前线程休眠一段时间。 - **interrupt()**:中断线程,调用`isInterrupted()`或`interrupted()`检查中断状态。 - **同步机制**:包括`synchronized`关键字、`wait()`, `notify()`和`notifyAll...
Java多线程并发编程是Java开发中的重要领域,它涉及到如何高效地利用计算机资源,特别是在多核处理器系统中,能够显著提升程序的执行效率。在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的...
sleep()方法让当前线程暂停执行一段时间;yield()方法让当前线程放弃CPU使用权,让其他线程有机会执行。此外,还可以通过设置优先级来影响线程调度,但Java线程优先级的使用并不保证线程的执行顺序,只是提供了一个...
Java多线程编程技术是Java编程语言中的一项高级技术,其主要目的是让开发者能够编写出能够同时执行多个操作的程序,以提高程序的执行效率和响应性。在多核处理器日益普及的今天,合理运用多线程技术对于充分利用系统...
- 缺点:Java不允许一个类继承多个类,因此这种方式限制了类的继承。 - 实现`Runnable`接口 - 优点:灵活,可以实现多个接口。 - 缺点:相对复杂,需要手动创建`Thread`对象。 2. **synchronized关键字** - **...
5. **超时机制**:设定请求资源的超时时间,超过这个时间未获得资源,进程可以放弃并重新尝试。 6. **死锁检测与恢复**:定期检查系统状态,发现死锁后采取相应的恢复策略。 理解并发和死锁的概念,以及如何在实际...
6. **Remember Me**: Spring Security 提供了“记住我”功能,允许用户在一段时间内无需重新登录。这个功能通过在用户的浏览器中设置长期 cookie 来实现。 7. **Session Management**: 该组件管理用户会话,防止...
它允许开发者等待一段时间,确保所有任务完成或者达到预设的超时限制。 **submit() 方法** submit() 方法用于提交任务到 ExecutorService,它可以接受 Callable 或 Runnable 作为参数。Callable 任务返回一个结果,...
- `sleep()`使当前线程暂停一段时间,释放CPU但不释放锁。 - `wait()`使线程等待直到被唤醒或超时,同时释放了锁。 #### 48. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 - **同步**:请求发送者...
- **`sleep()`**:让当前正在执行的线程暂停一段时间(以毫秒为单位),然后继续执行。调用`sleep()`方法不会释放对象的锁。 - **`wait()`**:使一个线程等待直到另一个线程调用该对象的`notify()`或`notifyAll()`...
计时器功能可以通过Java的`javax.swing.Timer`类实现,它可以定期执行指定的任务,例如更新倒计时或者判断游戏是否超时。在处理图标匹配逻辑时,开发者可以利用数据结构,如数组或列表,存储已点击的方块信息,并...