- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
public interface Callable
1、 返回结果并且可能抛出异常的任务;
2、 Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的但是Runnable不会返回结果,并且无法抛出经过检查的异常;
3、 Executors类包含一些从其他普通形式转换成Callable类的实用方法;
接口中定义的唯一一个方法。
/**
*计算结果,如果无法计算结果,则抛出一个异常。
*/
V call() throws Exception;
与FutureTask结合使用。
与Runnable区别:
1、 实现Callable接口能返回结果;而实现Runnable接口不能返回结果;
2、 实现Callable接口可抛出经过检查的异常;而实现Runnable接口不能抛出异常;
public interface Future
1、 Future表示异步计算的结果;
2、 它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法取消则由cancel方法来执行还提供了其他方法,以确定任务是正常完成还是被取消了一旦计算完成,就不能再取消计算;
3、 如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future形式类型、并返回null作为底层任务的结果;
通俗地理解就是可以对正在执行的任务进行维护操作(取消任务、获取任务执行结果、判断任务是否已完成等)。
接口方法
boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。
/**
* 如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。
* 当调用 cancel 时,如果调用成功,而此任务尚未启动,则此任务将永不运行。
* 如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。
* 此方法返回后,对 isDone() 的后续调用将始终返回 true。
* 如果此方法返回 true,则对 isCancelled() 的后续调用将始终返回 true。
*/
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。
boolean isDone():如果任务已完成,则返回 true。 可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回 true。
Vget():如有必要,等待计算完成,然后获取其结果。
/**
* 如有必要,等待计算完成,然后获取其结果。
*
* @return 计算的结果
* @throws CancellationException - 如果计算被取消
* @throws ExecutionException - 如果计算抛出异常
* @throws InterruptedException - 如果当前的线程在等待时被中断
*/
V get() throws InterruptedException, ExecutionException;
Vget(long timeout, TimeUnit unit):如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
public interface RunnableFuture extends Runnable, Future
1、 作为Runnable的Future成功执行run方法可以完成Future并允许访问其结果;
唯一方法
/**
* 在未被取消的情况下,将此 Future 设置为计算的结果。
*/
void run();
public class FutureTask implements RunnableFuture
1、 可取消的异步计算;
2、 利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对Future的基本实现;
3、 可使用FutureTask包装Callable或Runnable对象因为FutureTask实现了Runnable,所以可将FutureTask提交给Executor执行;
4、 仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞get方法一旦计算完成,就不能再重新开始或取消计算;
成员变量
/** Synchronization control for FutureTask */
private final Sync sync;
构造方法
/**
* 创建一个 FutureTask,一旦运行就执行给定的 Callable。
*/
public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
sync = new Sync(callable);
}
/**
* 创建一个 FutureTask,一旦运行就执行给定的 Runnable,并安排成功完成时 get 返回给定的结果 。
*/
public FutureTask(Runnable runnable, V result) {
sync = new Sync(Executors.callable(runnable, result));
}
内部类Sync
private final class Sync extends AbstractQueuedSynchronizer {
/** The underlying callable */
private final Callable<V> callable;
/** The result to return from get() */
private V result;
/** The exception to throw from get() */
private Throwable exception;
/**
* The thread running task. When nulled after set/cancel, this
* indicates that the results are accessible. Must be
* volatile, to ensure visibility upon completion.
*/
private volatile Thread runner;
Sync(Callable<V> callable) {
this.callable = callable;
}
}
方法
boolean cancel(boolean mayInterruptIfRunning):试图取消对此任务的执行。
public boolean cancel(boolean mayInterruptIfRunning) {
return sync.innerCancel(mayInterruptIfRunning);
}
/*sync.innerCancel方法*/
boolean innerCancel(boolean mayInterruptIfRunning) {
for (;;) {
int s = getState();//获取当前线程状态
if (ranOrCancelled(s))//判断线程是否需要取消
return false;
if (compareAndSetState(s, CANCELLED))//设置线程为已取消状态
break;
}
if (mayInterruptIfRunning) {//需要中断线程,中断当前线程
Thread r = runner;
if (r != null)
r.interrupt();
}
releaseShared(0);
done();
return true;
}
Vget():如有必要,等待计算完成,然后获取其结果。
public V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
return sync.innerGet(unit.toNanos(timeout));
}
/*Sync.innerGet*/
V innerGet(long nanosTimeout) throws InterruptedException, ExecutionException, TimeoutException {
if (!tryAcquireSharedNanos(0, nanosTimeout))//判断是否超时
throw new TimeoutException();
if (getState() == CANCELLED)//判断线程是否已取消
throw new CancellationException();
if (exception != null)
throw new ExecutionException(exception);
return result;//返回预期指定的结果
}
boolean isCancelled():如果在任务正常完成前将其取消,则返回 true。
public boolean isCancelled() {
return sync.innerIsCancelled();
}
boolean innerIsCancelled() {
return getState() == CANCELLED;//判断线程状态是否已取消
}
boolean isDone():如果任务已完成,则返回 true。
public boolean isDone() {
return sync.innerIsDone();
}
boolean innerIsDone() {
return ranOrCancelled(getState()) && runner == null;
}
void run(): 除非已将此 Future 取消,否则将其设置为其计算的结果。
public void run() {
sync.innerRun();
}
void innerRun() {
if (!compareAndSetState(0, RUNNING))//判断是否需要执行
return;
try {
runner = Thread.currentThread();
if (getState() == RUNNING) // 再次检查状态
innerSet(callable.call());//执行任务并返回结果
else
releaseShared(0); // cancel
} catch (Throwable ex) {
innerSetException(ex);
}
}
FutureTask还提供了受保护的runAndReset、set、setException方法,及默认实现不执行任何操作的done方法,便于自定义任务类。
从源码可知,FutureTask对线程的操作,都是通过内部类Sync实现的,其中通过CAS无锁操作维护线程状态,volatile Thread runner 保证当前线程任务的内存可见性,任务执行完成返回的结果存储在V result中。
总结:
由于FutureTask继承了Callable和Runnable,故既可作为一个Runnable直接被Thread执行,也可作为Future用来得到Callable的计算结果。
FutureTask一般配合ExecutorService来使用,也可以直接通过Thread来使用。
当调用cancel(true)方法的时候,最终执行Thread.interrupt()方法,而interrupt()方法只是设置中断标志位,如果runner处于sleep()、wait()或者join()处理中则会抛出InterruptedException异常。
FutureTask提供可得到返回结果及 protected 功能,让FutureTask扩展性增强。
Callable、Future、FutureTask关系。
FutureTask实现Future接口,可以对任务进行维护操作,包装 Callable可得到任务执行完成后计算的结果。
我将 Bootstrap 与 css 和 java 脚本结合使用。在不影响前端代码的情况下,我真的很难在css中绘制这个背景。在许多问题中,人们将宽度和高度设置为 0%。但是由于我的导航栏,我不能使用
我正在用 c 编写一个程序来读取文件的内容。代码如下: #include void main() { char line[90]; while(scanf("%79[^\
我想使用 javascript 获取矩阵数组的所有对 Angular 线。假设输入输出如下: input = [ [1,2,3], [4,5,6], [7,8,9], ] output =
可以用pdfmake绘制lines,circles和other shapes吗?如果是,是否有documentation或样本?我想用jsPDF替换pdfmake。 最佳答案 是的,有可能。 pdfm
我有一个小svg小部件,其目的是显示角度列表(参见图片)。 现在,角度是线元素,仅具有笔触,没有填充。但是现在我想使用一种“内部填充”颜色和一种“笔触/边框”颜色。我猜想line元素不能解决这个问题,
我正在为带有三角对象的 3D 场景编写一个非常基本的光线转换器,一切都工作正常,直到我决定尝试从场景原点 (0/0/0) 以外的点转换光线。 但是,当我将光线原点更改为 (0/1/0) 时,相交测试突
这个问题已经有答案了: Why do people write "#!/usr/bin/env python" on the first line of a Python script? (22 个回
如何使用大约 50 个星号 * 并使用 for 循环绘制一条水平线?当我尝试这样做时,结果是垂直(而不是水平)列出 50 个星号。 public void drawAstline() { f
这是一个让球以对角线方式下降的 UI,但球保持静止;线程似乎无法正常工作。你能告诉我如何让球移动吗? 请下载一个球并更改目录,以便程序可以找到您的球的分配位置。没有必要下载足球场,但如果您愿意,也可以
我在我的一个项目中使用 Jmeter 和 Ant,当我们生成报告时,它会在报告中显示 URL、#Samples、失败、成功率、平均时间、最短时间、最长时间。 我也想在报告中包含 90% 的时间线。 现
我有一个不寻常的问题,希望有人能帮助我。我想用 Canvas (android) 画一条 Swing 或波浪线,但我不知道该怎么做。它将成为蝌蚪的尾部,所以理想情况下我希望它的形状更像三角形,一端更大
这个问题已经有答案了: Checking Collision of Shapes with JavaFX (1 个回答) 已关闭 8 年前。 我正在使用 JavaFx 8 库。 我的任务很简单:我想检
如何按编号的百分比拆分文件。行数? 假设我想将我的文件分成 3 个部分(60%/20%/20% 部分),我可以手动执行此操作,-_-: $ wc -l brown.txt 57339 brown.tx
我正在努力实现这样的目标: 但这就是我设法做到的。 你能帮我实现预期的结果吗? 更新: 如果我删除 bootstrap.css 依赖项,问题就会消失。我怎样才能让它与 Bootstrap 一起工作?
我目前正在构建一个网站,但遇到了 transform: scale 的问题。我有一个按钮,当用户将鼠标悬停在它上面时,会发生两件事: 背景以对 Angular 线“扫过” 按钮标签颜色改变 按钮稍微变
我需要使用直线和仿射变换绘制大量数据点的图形(缩放图形以适合 View )。 目前,我正在使用 NSBezierPath,但我认为它效率很低(因为点在绘制之前被复制到贝塞尔路径)。通过将我的数据切割成
我正在使用基于 SVM 分类的 HOG 特征检测器。我可以成功提取车牌,但提取的车牌除了车牌号外还有一些不必要的像素/线。我的图像处理流程如下: 在灰度图像上应用 HOG 检测器 裁剪检测到的区域 调
我有以下图片: 我想填充它的轮廓(即我想在这张图片中填充线条)。 我尝试了形态学闭合,但使用大小为 3x3 的矩形内核和 10 迭代并没有填满整个边界。我还尝试了一个 21x21 内核和 1 迭代,但
我必须找到一种算法,可以找到两组数组之间的交集总数,而其中一个数组已排序。 举个例子,我们有这两个数组,我们向相应的数字画直线。 这两个数组为我们提供了总共 7 个交集。 有什么样的算法可以帮助我解决
简单地说 - 我想使用透视投影从近裁剪平面绘制一条射线/线到远裁剪平面。我有我认为是使用各种 OpenGL/图形编程指南中描述的方法通过单击鼠标生成的正确标准化的世界坐标。 我遇到的问题是我的光线似乎
我是一名优秀的程序员,十分优秀!