标签: futuretask

FutureTask cancel()

基本上我有以下片段,


(let [task (FutureTask. fn)
      thr (Thread. task)]
  (.start thr)
  ;;wait for signal...
  (.cancel task true)
  (.stop thr))

问题是偶尔取消不起作用,AFAICT取消原因和异常被抛出但是一些代码下线了吗?是否有可靠的方法取消未来的任务?

fn是一个基本上执行一系列长时间运行计算的函数,因此我无法循环检查布尔标志.

java clojure futuretask

2
推荐指数
1
解决办法
2901
查看次数

将Context(CDI/servlet)注入新的FutureTask Thread

我发现在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)

java multithreading servlets futuretask cdi

2
推荐指数
1
解决办法
3259
查看次数

在调用FutureTask的run方法时,如何消除声纳qube问题?

我有以下代码,其中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解决方案?请指教.

java multithreading futuretask sonarqube

2
推荐指数
1
解决办法
735
查看次数

Monad变形金刚用Javascript解释?

我很难理解monad变换器,部分原因是大多数示例和解释都使用Haskell.

任何人都可以举一个例子来创建一个变换器来合并Javascript中的Future和Either monad以及如何使用它.

如果你可以使用ramda-fantasy这些monad 的实现,那就更好了.

javascript monads functional-programming futuretask either

2
推荐指数
1
解决办法
1052
查看次数

如何从Executor Service有效地处理多个结果

我是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)

java multithreading callable executorservice futuretask

1
推荐指数
1
解决办法
1021
查看次数

同时读取2个文件,没有更多的性能

我试着同时读取文件并返回行数

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

为什么?

java multithreading futuretask

0
推荐指数
1
解决办法
123
查看次数

识别 AWT 线程

我有一个类,它装饰 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 …

java swing multithreading futuretask invokelater

0
推荐指数
1
解决办法
225
查看次数