Как я могу установить тайм-аут вокруг некоторого кода в Java на основном потоке?

Мы не можем изменить внутренние адаптеры для Json* классов, потому что Gson использует предопределенный com.google.gson.internal.bind.TypeAdapters.JSON_ELEMENT . Но, к счастью, мы можем предоставить нашу JsonWriter реализацию. Переопределите методы, которые вам нужны, и предоставьте свою реализацию процессу сериализации. Для округления двойных чисел используйте, например, BigDecimal. Пример пользовательской реализации:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.stream.JsonWriter;

import java.io.IOException;
import java.io.StringWriter;
import java.math.BigDecimal;

public class GsonApp {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder().create();
        JsonArray array = new JsonArray();
        array.add(Math.PI);
        array.add(Math.E);

        StringWriter stringWriter = new StringWriter();
        JsonWriter jsonWriter = new JsonWriter(stringWriter) {
            @Override
            public JsonWriter value(Number value) throws IOException {
                BigDecimal bigDecimal = BigDecimal.valueOf(value.doubleValue());
                BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);

                return super.value(result.doubleValue());
            }
        };
        jsonWriter.setIndent("  ");

        gson.toJson(array, jsonWriter);
        System.out.println(stringWriter.toString());
    }
}

Над кодом напечатаны:

[
  3.142,
  2.719
]

См. Также:

7
задан 4 May 2009 в 07:18
поделиться

3 ответа

Вы можете создать ThreadPoolExecutor , который имеет invokeAll метод, который получает тайм-аут в качестве параметра.

0
ответ дан 7 December 2019 в 20:38
поделиться

Не можете ли вы просто использовать Java Timer ?

Возможность для потоков планировать задачи для будущего выполнения в фоновом потоке. Задачи могут быть запланированы для одноразового выполнения или для повторного выполнения с регулярными интервалами.

2
ответ дан 7 December 2019 в 20:38
поделиться

Либо запустите его в потоке, либо сделайте что-то вроде этого:

void method() {
    long endTimeMillis = System.currentTimeMillis() + 10000;
    while (true) {
        // method logic
        if (System.currentTimeMillis() > endTimeMillis) {
            // do some clean-up
            return;
        }
    }
}

Как видите, это не работает для всех видов методов.

-1
ответ дан 7 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: