Мы не можем изменить внутренние адаптеры для 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
]
См. Также:
Вы можете создать ThreadPoolExecutor , который имеет invokeAll метод, который получает тайм-аут в качестве параметра.
Не можете ли вы просто использовать Java Timer ?
Возможность для потоков планировать задачи для будущего выполнения в фоновом потоке. Задачи могут быть запланированы для одноразового выполнения или для повторного выполнения с регулярными интервалами.
Либо запустите его в потоке, либо сделайте что-то вроде этого:
void method() {
long endTimeMillis = System.currentTimeMillis() + 10000;
while (true) {
// method logic
if (System.currentTimeMillis() > endTimeMillis) {
// do some clean-up
return;
}
}
}
Как видите, это не работает для всех видов методов.