基本上我有以下片段,
(let [task (FutureTask. fn)
thr (Thread. task)]
(.start thr)
;;wait for signal...
(.cancel task true)
(.stop thr))
问题是偶尔取消不起作用,AFAICT取消原因和异常被抛出但是一些代码下线了吗?是否有可靠的方法取消未来的任务?
fn是一个基本上执行一系列长时间运行计算的函数,因此我无法循环检查布尔标志.
我发现在servlet donot中创建的新线程包含servlet/CDI上下文.我创建了一个HelloWorld servlet(如下所示)来试验这个问题.在下面的示例中,您将看到我在新的Thread(FutureTask)中运行'doIt()'函数.但是它返回NULL但是当我直接调用'doIt()'方法时,BeanManager不是NULL.
/**
* Servlet implementation class HelloWorld
*/
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(HelloWorld.class
.getName());
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<head><title>Hello World Servlet</title></head>");
writer.println("<body>");
writer.println("<h1>Context injection into Thread Experiment</h1>");
try {
// 1. This is NOT working
new Thread(testTask).start();
testTask.get(5000, TimeUnit.SECONDS);
// 2. This is working …Run Code Online (Sandbox Code Playgroud) 我有以下代码,其中Sonar Qube引发了严重错误.
public void onMessageReceived(Message message) {
if((message.getTargetInstanceId() != Message.ANY_TARGET) && (message.getTargetInstanceId() != this.instanceId)) {
//Invalid message ignore
return;
} else {
int randTime = ran.nextInt(2000);
FutureTask<Message> workerTask = new FutureTask<>(new DummyCommandHandler(randTime, message,messageBus,instanceId));
workerTask.run();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我得到的问题.
Description Assignee Resource New issue
Thread.run() and Runnable.run() should not be called directly : Call the method Thread.start() to execute the content of the run() method in a dedicated thread.
Run Code Online (Sandbox Code Playgroud)
要在FutureTask中调用start方法,它首先没有start方法.它只有一个run方法.我怎样才能克服这个问题?有没有Java解决方案或Sonarqube解决方案?请指教.
我很难理解monad变换器,部分原因是大多数示例和解释都使用Haskell.
任何人都可以举一个例子来创建一个变换器来合并Javascript中的Future和Either monad以及如何使用它.
如果你可以使用ramda-fantasy这些monad 的实现,那就更好了.
我是ExecutorService的新手,但我不确定我的方法.对于已知任务,我可以处理多达100个线程.我正在使用下面的通用格式,在那里我创建了FutureTasks列表,然后将它们提交给ExecutorService.ExecutorService返回并将这些挂起的结果添加到另一个列表中.然后我迭代这个列表,在每个挂起的结果上调用get().
我的查询是:直到所有100个线程都完成后,依次不会在每个get()上阻塞吗?有一个更好的方法吗 ?
我是否正确假设get()返回Callable实现的call()方法的结果?我正在使用默认的FutureTask类,并没有将其子类化.
ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );
List<JobClass> originalList = new ArrayList<JobClass>();
List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();
List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();
for( JobClass sc : originalList )
pendingResult.add( submit( sc );
for( Future<SomeOtherClass> future : futures )
resultList.add( future.get(5, TimeUnit.SECONDS) );
Run Code Online (Sandbox Code Playgroud) 我试着同时读取文件并返回行数
ExecutorService executor = Executors.newFixedThreadPool(2);
FutureTask<Integer> futureOne = new FutureTask<Integer>(new Calcul1());
FutureTask<Integer> futureTwo = new FutureTask<Integer>(new Calcul2());
executor.execute(futureOne);
executor.execute(futureTwo);
while (!(futureOne.isDone() && futureTwo.isDone())) {
}
System.out.println(futureOne.get() + futureTwo.get());
executor.shutdown();
Run Code Online (Sandbox Code Playgroud)
这工作得很好但我发现如果我读取文件1和文件2后更快...所以我没有得到任何性能提升futureTash
为什么?
我有一个类,它装饰 Swing 中的 JTextComponent。它包含的方法可以从任何线程调用,因此我必须确保与 JTextComponent 一起使用的代码将由 AWT 线程执行。
第二个要求是,调用整个方法的线程将“等待”,直到 AWT 线程完成任务。
public String getSelectedText() {
Callable c = new Callable() {
@Override
public Object call() throws Exception {
if (area.getSelectedText() == null) {
return "";
}
return area.getSelectedText();
}
};
if (Thread.currentThread().getName().contains("AWT")) {
return (String)c.call();
}
else {
FutureTask task = new FutureTask(c);
SwingUtilities.invokeLater(task);
while (!task.isDone()) {
//waiting
}
try {
return (String)task.get();
}
catch (InterruptedException | ExecutionException ex) {
return "";
}
}
}
Run Code Online (Sandbox Code Playgroud)
该代码对我来说运行良好,但仍然存在一个问题。如果有人想要使用我的类,重命名 AWT 线程,那么它就会陷入死锁。
有什么方法可以明确识别 AWT …
futuretask ×7
java ×6
callable ×1
cdi ×1
clojure ×1
either ×1
invokelater ×1
javascript ×1
monads ×1
servlets ×1
sonarqube ×1
swing ×1