相关疑难解决方法(0)

Java等效的C#async/await?

我是一名普通的C#开发人员,但偶尔也会用Java开发应用程序.我想知道是否有任何Java等价的C#async/await?简单来说,java的等价物是什么:

async Task<int> AccessTheWebAsync()
{ 
    HttpClient client = new HttpClient();
    var urlContents = await client.GetStringAsync("http://msdn.microsoft.com");
    return urlContents.Length;
}
Run Code Online (Sandbox Code Playgroud)

c# java

127
推荐指数
10
解决办法
8万
查看次数

在java中有一个'阻止直到条件变为真'的功能吗?

我正在为服务器编写一个监听器线程,目前我正在使用:

while (true){
    try {
        if (condition){
            //do something
            condition=false;
        }
        sleep(1000);

    } catch (InterruptedException ex){
        Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我遇到了运行函数吃掉所有cpu时间循环的问题.睡眠功能有效,但它似乎是一个临时修复,而不是解决方案.

是否有一些函数会阻塞,直到变量'condition'变为'true'?或者是不断循环标准的等待方法,直到变量的值发生变化?

java multithreading block

66
推荐指数
7
解决办法
9万
查看次数

黄瓜测试Spring Boot应用程序

有谁知道我在哪里可以找到一个示例应用程序,其中Cucumber用于通过Gradle测试Spring Boot应用程序?我可以在cmd行上启动服务器并使用我的IDE运行测试,但我需要能够在CI服务器上以编程方式运行它们.我在这里看到了答案,但该解决方案对我不起作用,很可能是因为我有多个步骤def文件.

这是我的设置

build.grade(在另一个问题中提到)

testCompile ("org.springframework.boot:spring-boot-starter-test",
    ...
    "info.cukes:cucumber-spring:${cucumberVersion}")
Run Code Online (Sandbox Code Playgroud)

CucumberTest.java

@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest{
}
Run Code Online (Sandbox Code Playgroud)

AbstractSpringTest.java(由所有StepDef文件扩展)

@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }
Run Code Online (Sandbox Code Playgroud)

它在启动时没有做正确的事情,因为它1.尝试初始化我的步骤def文件和2.我的应用程序没有启动,黄瓜测试无法建立连接.

谢谢.

编辑:或者,如果有人可以告诉我如何使用gradle启动和停止应用程序,那也是可以接受的.

java spring cucumber-jvm spring-boot

24
推荐指数
2
解决办法
3万
查看次数

如何在Java/Android中另一个线程启动之前等待线程完成?

假设我有这个非常简单的代码:

for(int i = 0; i < 10; i++) { 
    thread = new Thread(this); 
    thread.start(); 
} 
Run Code Online (Sandbox Code Playgroud)

但是,在此代码中,线程显然一次启动10次,并且在前一个完成之前不会等待.在让线程再次启动之前,如何检查线程是否完成?

java multithreading android loops

19
推荐指数
2
解决办法
6万
查看次数

可重置的倒计时补丁

我需要的东西直接等同于CountDownLatch,但可以重置(保持线程安全!).我不能使用经典的同步结构,因为它们在这种情况下根本不起作用(复杂的锁定问题).目前,我正在创建许多CountDownLatch对象,每个对象都替换前一个对象.我相信这是在GC中的年轻一代(由于物体数量庞大).您可以看到使用下面的锁存器的代码(它java.net是ns-3网络模拟器接口的模拟的一部分).

一些想法可能是尝试CyclicBarrier(JDK5 +)或Phaser(JDK7)

我可以测试代码并回到找到解决此问题的任何人,因为我是唯一可以将其插入正在运行的系统中以查看发生的情况的人:)

/**
 *
 */
package kokunet;

import java.io.IOException;
import java.nio.channels.ClosedSelectorException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import kokuks.IConnectionSocket;
import kokuks.KKSAddress;
import kokuks.KKSSocket;
import kokuks.KKSSocketListener;

/**
 * KSelector
 * @version 1.0
 * @author Chris Dennett
 */
public class KSelector extends SelectorImpl {
    // True if this Selector has been closed
    private volatile boolean closed = false;

    // Lock for close and cleanup
    final class CloseLock {} …
Run Code Online (Sandbox Code Playgroud)

java concurrency css-selectors countdownlatch cyclicbarrier

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

等待Timer在Java中完成

我正在使用java.util.Timer来安排定期任务.有一次,我想关闭它,等待它完成.

Timer.cancel()将阻止任何未来的任务运行.我如何确保当前没有任何任务正在运行(如果是的话,还是等待它们?)

我可以引入外部同步机制,但我不知道它们如何涵盖所有情况.例如,如果我在任务中的某个Monitor上进行同步,我仍然会错过任务刚刚开始执行但没有使用监视器的情况.

等待所有任务真正完成的建议做法是什么,包括当前正在运行的任务?

java synchronization timer monitor

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

获取线程的输出

您认为获得线程工作结果的最佳方法是什么?想象一个线程做一些计算,你如何警告主程序计算完成?

对于一些名为"job finished"的公共变量,你可以每隔X毫秒轮询一次,或者顺便说一下,然后你会收到比它们可用时更晚的结果......主代码会浪费时间等待它们.另一方面,如果使用较低的X,CPU将浪费多次轮询.

那么,你怎么知道Thread或者一些Threads已经完成了他们的工作呢?

很抱歉,如果它看起来与其他问题类似,那可能是eben答案的原因,我想.我所测量的是运行大量线程并知道所有线程何时完成,而不进行轮询.

我更多地考虑使用批量线程在多个CPU之间共享CPU负载,并知道批处理何时完成.我想它可以用Future的对象完成,但是阻塞get方法看起来很像隐藏锁,而不是我喜欢的东西.

谢谢大家的支持.Althought我也喜欢通过回答埃里克森,我觉得SAUA的最完整的,和一个我会在自己的代码中使用.

java multithreading

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

如何确保该方法只执行一次并且仅从一个线程执行?

我有一个下面的方法,我想在以下条件下执行:

  • 此方法只应执行一次.一旦它被执行,它就不能再次执行,所以如果有人再次尝试执行,它应该通过记录一些有用的错误消息already executed或任何有用的东西返回.
  • 它应该只由一个线程执行.因此,如果多个线程正在调用下面的方法,那么它应该只由一个线程调用,其他线程应该等待初始化完成?

以下是我的方法:

  public void initialize() {
    List<Metadata> metadata = getMetadata(true);
    List<Process> process = getProcess();
    if (!metadata.isEmpty() && !process.isEmpty()) {
        Manager.setAllMetadata(metadata, process);
    }
    startBackgroundThread();
  }
Run Code Online (Sandbox Code Playgroud)

这可能吗?我正在使用Java 7.

java concurrency multithreading

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

在Java中暂停for循环

有没有办法在Java中暂停for循环?那么有没有办法仅在出现提示时进行一次迭代?我阅读了此http://answers.yahoo.com/question/index?qid=20100212201605AAazS73,该解决方案似乎可能存在一些问题,主要是因为我不完全了解for循环检查其标头的顺序。我想到的唯一可以完成类似任务的方法如下

    do {
        if (FLAG) {
            //Do procedure
            i++;
            FLAG = false;
        }
    } while ( i < 6);
Run Code Online (Sandbox Code Playgroud)

当该标志为真时,该过程完成并且计数器向前移动一个。不过,我不喜欢这样,因为只要我没记错,只要计数器低于6,它就会一直循环播放。有任何想法吗?

-很抱歉,您不清楚。在我的情况下,FLAG是一个可以从另一个类调用的静态布尔值。我提到的程序取决于我。

java loops

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

等到线程完成

我有一个函数,它的内部线程可以做某事

public static void animate(int column,Image image)
{

    new Thread(new Runnable() {
        public void run() {
            try {

                    /* Code */
                    repaint();
                    Thread.sleep(500);
                    repaint();

            } catch (InterruptedException ex) {
            }
        }
    }).start();
}
Run Code Online (Sandbox Code Playgroud)

我在 updateBoard 函数中调用的动画函数,然后是 i++。我想让函数动画在线程结束之前不继续 I++

在函数内部,animate我使用repaint()了 Swing 中的函数,当我尝试使用.join()它的块repaint()线程时。

public static void updateBoard(int column, Image image) {
    int i = 0;
    animate(column,image);
    i++;
}
Run Code Online (Sandbox Code Playgroud)

java swing multithreading

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