From 53684668abf1af1b72a87a2e409e8449d30d4d8c Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sun, 27 Dec 2020 15:38:33 +0100 Subject: [PATCH] Use CompletableFuture.runAsync instead of creating new Threads --- .../java/ctbrec/ui/CamrecApplication.java | 6 ++--- .../java/ctbrec/ui/PreviewPopupHandler.java | 7 ++---- .../ui/StreamSourceSelectionDialog.java | 3 ++- client/src/main/java/ctbrec/ui/TipDialog.java | 3 ++- .../src/main/java/ctbrec/ui/TokenLabel.java | 3 ++- .../ui/action/CheckModelAccountAction.java | 4 +-- .../ctbrec/ui/action/EditNotesAction.java | 5 ++-- .../ctbrec/ui/action/ModelMassEditAction.java | 11 ++------ .../ctbrec/ui/action/OpenRecordingsDir.java | 3 ++- .../ui/action/ToggleRecordingAction.java | 6 ++--- .../ui/controls/SearchPopoverTreeList.java | 9 ++++--- .../ctbrec/ui/controls/StreamPreview.java | 5 ++-- .../main/java/ctbrec/ui/controls/Toast.java | 6 +++-- .../src/main/java/ctbrec/ui/news/NewsTab.java | 17 +++++++------ .../ui/sites/bonga/BongaCamsSiteUi.java | 18 +++++++------ .../ui/sites/camsoda/CamsodaShowsTab.java | 15 +++++------ .../ui/sites/jasmin/LiveJasminSiteUi.java | 5 ++-- .../sites/myfreecams/MyFreeCamsTableTab.java | 5 ++-- .../ctbrec/ui/sites/showup/ShowupSiteUi.java | 5 ++-- .../java/ctbrec/ui/tabs/RecordingsTab.java | 25 ++++++++----------- .../main/java/ctbrec/ui/tabs/ThumbCell.java | 8 +++--- 21 files changed, 86 insertions(+), 83 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/CamrecApplication.java b/client/src/main/java/ctbrec/ui/CamrecApplication.java index 03c539a9..1278e97d 100644 --- a/client/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/client/src/main/java/ctbrec/ui/CamrecApplication.java @@ -14,6 +14,7 @@ import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -461,7 +462,7 @@ public class CamrecApplication extends Application { } private void checkForUpdates() { - Thread updateCheck = new Thread(() -> { + CompletableFuture.runAsync(() -> { String url = "https://pastebin.com/raw/mUxtKzyB"; Request request = new Request.Builder().url(url).build(); try (Response response = httpClient.execute(request)) { @@ -488,9 +489,6 @@ public class CamrecApplication extends Application { LOG.warn("Update check failed: {}", e.getMessage()); } }); - updateCheck.setName("Update Check"); - updateCheck.setDaemon(true); - updateCheck.start(); } public static Version getVersion() throws IOException { diff --git a/client/src/main/java/ctbrec/ui/PreviewPopupHandler.java b/client/src/main/java/ctbrec/ui/PreviewPopupHandler.java index 5c05eb98..5b8434a2 100644 --- a/client/src/main/java/ctbrec/ui/PreviewPopupHandler.java +++ b/client/src/main/java/ctbrec/ui/PreviewPopupHandler.java @@ -1,6 +1,7 @@ package ctbrec.ui; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -145,7 +146,7 @@ public class PreviewPopupHandler implements EventHandler { } private void createTimerThread() { - Thread timerThread = new Thread(() -> { + CompletableFuture.runAsync(() -> { while(true) { openCountdown--; if(openCountdown == 0) { @@ -181,9 +182,5 @@ public class PreviewPopupHandler implements EventHandler { } } }); - timerThread.setDaemon(true); - timerThread.setPriority(Thread.MIN_PRIORITY); - timerThread.setName("PreviewPopupTimer"); - timerThread.start(); } } diff --git a/client/src/main/java/ctbrec/ui/StreamSourceSelectionDialog.java b/client/src/main/java/ctbrec/ui/StreamSourceSelectionDialog.java index 2aa64e8f..42c7c854 100644 --- a/client/src/main/java/ctbrec/ui/StreamSourceSelectionDialog.java +++ b/client/src/main/java/ctbrec/ui/StreamSourceSelectionDialog.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.function.Function; @@ -61,7 +62,7 @@ public class StreamSourceSelectionDialog { } }); selectStreamSource.setOnFailed(e -> onFail.apply(selectStreamSource.getException())); - new Thread(selectStreamSource).start(); + CompletableFuture.runAsync(selectStreamSource); } private static class BestStreamSource extends StreamSource { diff --git a/client/src/main/java/ctbrec/ui/TipDialog.java b/client/src/main/java/ctbrec/ui/TipDialog.java index 459d8d8a..5c1b8ecd 100644 --- a/client/src/main/java/ctbrec/ui/TipDialog.java +++ b/client/src/main/java/ctbrec/ui/TipDialog.java @@ -2,6 +2,7 @@ package ctbrec.ui; import java.text.DecimalFormat; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.slf4j.Logger; @@ -78,7 +79,7 @@ public class TipDialog extends TextInputDialog { } } }; - new Thread(task).start(); + CompletableFuture.runAsync(task); } private void showErrorDialog(Throwable throwable) { diff --git a/client/src/main/java/ctbrec/ui/TokenLabel.java b/client/src/main/java/ctbrec/ui/TokenLabel.java index 917dad12..6a5cd5c8 100644 --- a/client/src/main/java/ctbrec/ui/TokenLabel.java +++ b/client/src/main/java/ctbrec/ui/TokenLabel.java @@ -3,6 +3,7 @@ package ctbrec.ui; import java.text.DecimalFormat; import java.util.Map; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.slf4j.Logger; @@ -83,6 +84,6 @@ public class TokenLabel extends Label { } } }; - new Thread(task).start(); + CompletableFuture.runAsync(task); } } diff --git a/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java b/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java index e9f3b188..fdcf4d5c 100644 --- a/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java +++ b/client/src/main/java/ctbrec/ui/action/CheckModelAccountAction.java @@ -3,6 +3,7 @@ package ctbrec.ui.action; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +30,7 @@ public class CheckModelAccountAction { public void execute() { String buttonText = b.getText(); b.setDisable(true); - Runnable checker = (() -> { + CompletableFuture.runAsync(() -> { List deletedAccounts = new ArrayList<>(); try { List models = recorder.getModels(); @@ -66,6 +67,5 @@ public class CheckModelAccountAction { }); } }); - new Thread(checker).start(); } } diff --git a/client/src/main/java/ctbrec/ui/action/EditNotesAction.java b/client/src/main/java/ctbrec/ui/action/EditNotesAction.java index 2a23edec..e55b77c0 100644 --- a/client/src/main/java/ctbrec/ui/action/EditNotesAction.java +++ b/client/src/main/java/ctbrec/ui/action/EditNotesAction.java @@ -2,6 +2,7 @@ package ctbrec.ui.action; import java.io.IOException; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,7 +31,7 @@ public class EditNotesAction { public void execute() { source.setCursor(Cursor.WAIT); - new Thread(() -> Platform.runLater(() -> { + CompletableFuture.runAsync(() -> Platform.runLater(() -> { String notes = Config.getInstance().getSettings().modelNotes.getOrDefault(model.getUrl(), ""); Optional newNotes = Dialogs.showTextInput(source.getScene(), "Model Notes", "Notes for " + model.getName(), notes); newNotes.ifPresent(n -> { @@ -47,6 +48,6 @@ public class EditNotesAction { }); table.refresh(); source.setCursor(Cursor.DEFAULT); - })).start(); + })); } } diff --git a/client/src/main/java/ctbrec/ui/action/ModelMassEditAction.java b/client/src/main/java/ctbrec/ui/action/ModelMassEditAction.java index 70c6dfc1..f6da2d5d 100644 --- a/client/src/main/java/ctbrec/ui/action/ModelMassEditAction.java +++ b/client/src/main/java/ctbrec/ui/action/ModelMassEditAction.java @@ -2,11 +2,7 @@ package ctbrec.ui.action; import java.util.List; import java.util.Objects; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import ctbrec.Model; @@ -16,9 +12,6 @@ import javafx.scene.Node; public class ModelMassEditAction { - static BlockingQueue queue = new LinkedBlockingQueue<>(); - static ExecutorService threadPool = new ThreadPoolExecutor(2, 10, 10, TimeUnit.MINUTES, queue); - protected List models; protected Consumer action; protected Node source; @@ -42,7 +35,7 @@ public class ModelMassEditAction { Consumer cb = Objects.requireNonNull(callback, "Callback is null, call execute() instead"); source.setCursor(Cursor.WAIT); for (Model model : models) { - threadPool.submit(() -> { + CompletableFuture.runAsync(() -> { action.accept(model); cb.accept(model); Platform.runLater(() -> source.setCursor(Cursor.DEFAULT)); diff --git a/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java b/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java index c1390cc9..768a9298 100644 --- a/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java +++ b/client/src/main/java/ctbrec/ui/action/OpenRecordingsDir.java @@ -2,6 +2,7 @@ package ctbrec.ui.action; import java.io.File; import java.time.Instant; +import java.util.concurrent.CompletableFuture; import ctbrec.Config; import ctbrec.Model; @@ -25,7 +26,7 @@ public class OpenRecordingsDir { File fileForRecording = Config.getInstance().getFileForRecording(selectedModel, ".mp4", Instant.now()); File dir = fileForRecording.getParentFile(); if (dir.exists()) { - new Thread(() -> DesktopIntegration.open(dir)).start(); + CompletableFuture.runAsync(() -> DesktopIntegration.open(dir)); } else { Dialogs.showError(source.getScene(), "Directory does not exist", "There are no recordings for this model", null); } diff --git a/client/src/main/java/ctbrec/ui/action/ToggleRecordingAction.java b/client/src/main/java/ctbrec/ui/action/ToggleRecordingAction.java index 6e9fc155..f15f3e20 100644 --- a/client/src/main/java/ctbrec/ui/action/ToggleRecordingAction.java +++ b/client/src/main/java/ctbrec/ui/action/ToggleRecordingAction.java @@ -1,5 +1,7 @@ package ctbrec.ui.action; +import java.util.concurrent.CompletableFuture; + import ctbrec.recorder.Recorder; import ctbrec.ui.controls.Dialogs; import javafx.application.Platform; @@ -20,7 +22,7 @@ public class ToggleRecordingAction { public void execute() { toggleButton.setCursor(Cursor.WAIT); - Thread t = new Thread(() -> { + CompletableFuture.runAsync(() -> { try { if (pause) { recorder.pause(); @@ -36,7 +38,5 @@ public class ToggleRecordingAction { Platform.runLater(() -> toggleButton.setCursor(Cursor.DEFAULT)); } }); - t.setDaemon(true); - t.start(); } } diff --git a/client/src/main/java/ctbrec/ui/controls/SearchPopoverTreeList.java b/client/src/main/java/ctbrec/ui/controls/SearchPopoverTreeList.java index 3b469739..e52c247c 100644 --- a/client/src/main/java/ctbrec/ui/controls/SearchPopoverTreeList.java +++ b/client/src/main/java/ctbrec/ui/controls/SearchPopoverTreeList.java @@ -34,6 +34,7 @@ package ctbrec.ui.controls; import java.net.URL; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -167,7 +168,7 @@ public class SearchPopoverTreeList extends PopoverTreeList implements Pop follow = new Button("Follow"); follow.setOnAction(evt -> { setCursor(Cursor.WAIT); - new Thread(new Task() { + CompletableFuture.runAsync(new Task() { @Override protected Boolean call() throws Exception { model.getSite().login(); @@ -183,12 +184,12 @@ public class SearchPopoverTreeList extends PopoverTreeList implements Pop } Platform.runLater(() -> setCursor(Cursor.DEFAULT)); } - }).start(); + }); }); record = new Button("Record"); record.setOnAction(evt -> { setCursor(Cursor.WAIT); - new Thread(new Task() { + CompletableFuture.runAsync(new Task() { @Override protected Void call() throws Exception { recorder.startRecording(model); @@ -199,7 +200,7 @@ public class SearchPopoverTreeList extends PopoverTreeList implements Pop protected void done() { Platform.runLater(() -> setCursor(Cursor.DEFAULT)); } - }).start(); + }); }); getChildren().addAll(thumb, title, follow, record); diff --git a/client/src/main/java/ctbrec/ui/controls/StreamPreview.java b/client/src/main/java/ctbrec/ui/controls/StreamPreview.java index 9b1eb20e..249eda45 100644 --- a/client/src/main/java/ctbrec/ui/controls/StreamPreview.java +++ b/client/src/main/java/ctbrec/ui/controls/StreamPreview.java @@ -3,6 +3,7 @@ package ctbrec.ui.controls; import java.io.InterruptedIOException; import java.util.Collections; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -157,14 +158,14 @@ public class StreamPreview extends StackPane { running = false; MediaPlayer old = videoPlayer; Future oldFuture = future; - new Thread(() -> { + CompletableFuture.runAsync(() -> { if(oldFuture != null && !oldFuture.isDone()) { oldFuture.cancel(true); } if(old != null) { old.dispose(); } - }).start(); + }); } private void onError(MediaPlayer videoPlayer) { diff --git a/client/src/main/java/ctbrec/ui/controls/Toast.java b/client/src/main/java/ctbrec/ui/controls/Toast.java index e622013d..c74b7986 100644 --- a/client/src/main/java/ctbrec/ui/controls/Toast.java +++ b/client/src/main/java/ctbrec/ui/controls/Toast.java @@ -1,5 +1,7 @@ package ctbrec.ui.controls; +import java.util.concurrent.CompletableFuture; + import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; @@ -36,7 +38,7 @@ public final class Toast { KeyFrame fadeInKey1 = new KeyFrame(Duration.millis(fadeInDelay), new KeyValue(toastStage.getScene().getRoot().opacityProperty(), 1)); fadeInTimeline.getKeyFrames().add(fadeInKey1); fadeInTimeline.setOnFinished((ae) -> { - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { Thread.sleep(toastDelay); } catch (InterruptedException e) { @@ -47,7 +49,7 @@ public final class Toast { fadeOutTimeline.getKeyFrames().add(fadeOutKey1); fadeOutTimeline.setOnFinished((aeb) -> toastStage.close()); fadeOutTimeline.play(); - }).start(); + }); }); fadeInTimeline.play(); } diff --git a/client/src/main/java/ctbrec/ui/news/NewsTab.java b/client/src/main/java/ctbrec/ui/news/NewsTab.java index a5f11d8e..712b5a15 100644 --- a/client/src/main/java/ctbrec/ui/news/NewsTab.java +++ b/client/src/main/java/ctbrec/ui/news/NewsTab.java @@ -1,7 +1,16 @@ package ctbrec.ui.news; +import static ctbrec.io.HttpConstants.*; + +import java.io.IOException; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; + +import org.json.JSONObject; + import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.Moshi; + import ctbrec.io.HttpException; import ctbrec.ui.CamrecApplication; import ctbrec.ui.controls.Dialogs; @@ -14,12 +23,6 @@ import javafx.scene.control.Tab; import javafx.scene.layout.VBox; import okhttp3.Request; import okhttp3.Response; -import org.json.JSONObject; - -import java.io.IOException; -import java.util.Objects; - -import static ctbrec.io.HttpConstants.USER_AGENT; public class NewsTab extends Tab implements TabSelectionListener { private static final String ACCESS_TOKEN = "a2804d73a89951a22e0f8483a6fcec8943afd88b7ba17c459c095aa9e6f94fd0"; @@ -36,7 +39,7 @@ public class NewsTab extends Tab implements TabSelectionListener { @Override public void selected() { - new Thread(this::loadToots).start(); + CompletableFuture.runAsync(this::loadToots); } private void loadToots() { diff --git a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java index a75ab316..a391bc20 100644 --- a/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java +++ b/client/src/main/java/ctbrec/ui/sites/bonga/BongaCamsSiteUi.java @@ -1,17 +1,19 @@ package ctbrec.ui.sites.bonga; +import java.io.IOException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import ctbrec.sites.bonga.BongaCams; import ctbrec.sites.bonga.BongaCamsHttpClient; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.sites.AbstractSiteUi; import ctbrec.ui.sites.ConfigUI; import ctbrec.ui.tabs.TabProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; public class BongaCamsSiteUi extends AbstractSiteUi { @@ -44,7 +46,7 @@ public class BongaCamsSiteUi extends AbstractSiteUi { } else { BlockingQueue queue = new LinkedBlockingQueue<>(); try { - new Thread(() -> { + CompletableFuture.runAsync(() -> { // login with external browser window try { new BongaCamsElectronLoginDialog(bongaCams.getHttpClient().getCookieJar()); @@ -59,7 +61,7 @@ public class BongaCamsSiteUi extends AbstractSiteUi { Thread.currentThread().interrupt(); LOG.error("Error while signaling termination", e); } - }).start(); + }); queue.take(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java index c36d0e8e..bf62446f 100644 --- a/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java +++ b/client/src/main/java/ctbrec/ui/sites/camsoda/CamsodaShowsTab.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import org.json.JSONArray; import org.json.JSONObject; @@ -136,7 +137,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { }); } }; - new Thread(task).start(); + CompletableFuture.runAsync(task); } @Override @@ -202,7 +203,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { private void follow(Model model) { setCursor(Cursor.WAIT); - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { SiteUiFactory.getUi(model.getSite()).login(); model.follow(); @@ -214,12 +215,12 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { setCursor(Cursor.DEFAULT); }); } - }).start(); + }); } private void record(Model model) { setCursor(Cursor.WAIT); - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { recorder.startRecording(model); } catch (InvalidKeyException | NoSuchAlgorithmException | IllegalStateException | IOException e) { @@ -229,11 +230,11 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { setCursor(Cursor.DEFAULT); }); } - }).start(); + }); } private void loadImage(Model model, ImageView thumb) { - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { String url = camsoda.getBaseUrl() + "/api/v1/user/" + model.getName(); Request detailRequest = new Request.Builder().url(url).build(); @@ -270,7 +271,7 @@ public class CamsodaShowsTab extends Tab implements TabSelectionListener { } catch (Exception e) { LOG.error("Couldn't load model details", e); } - }).start(); + }); } private Node createLabel(String string, boolean bold) { diff --git a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java index 5975a489..6ae87f34 100644 --- a/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java +++ b/client/src/main/java/ctbrec/ui/sites/jasmin/LiveJasminSiteUi.java @@ -2,6 +2,7 @@ package ctbrec.ui.sites.jasmin; import java.io.IOException; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; @@ -55,7 +56,7 @@ public class LiveJasminSiteUi extends AbstractSiteUi { lastLoginTime = System.currentTimeMillis(); BlockingQueue queue = new LinkedBlockingQueue<>(); - new Thread (() -> { + CompletableFuture.runAsync(() -> { // login with external browser window try { new LiveJasminElectronLoginDialog(liveJasmin.getHttpClient().getCookieJar()); @@ -69,7 +70,7 @@ public class LiveJasminSiteUi extends AbstractSiteUi { } catch (InterruptedException e) { LOG.error("Error while signaling termination", e); } - }).start(); + }); try { queue.take(); diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java index 8581ca7f..9d283491 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; @@ -352,7 +353,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { if (Objects.equals(System.getenv("CTBREC_DEV"), "1")) { MenuItem debug = new MenuItem("debug"); - debug.setOnAction(e -> new Thread(() -> { + debug.setOnAction(e -> CompletableFuture.runAsync(() -> { for (Model m : selectedModels) { try { List sources = m.getStreamSources(); @@ -364,7 +365,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { LOG.error("Couldn't get stream sources", e1); } } - }).start()); + })); menu.getItems().add(debug); } diff --git a/client/src/main/java/ctbrec/ui/sites/showup/ShowupSiteUi.java b/client/src/main/java/ctbrec/ui/sites/showup/ShowupSiteUi.java index 3ab05d27..7cdd781e 100644 --- a/client/src/main/java/ctbrec/ui/sites/showup/ShowupSiteUi.java +++ b/client/src/main/java/ctbrec/ui/sites/showup/ShowupSiteUi.java @@ -2,6 +2,7 @@ package ctbrec.ui.sites.showup; import java.io.IOException; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.LinkedBlockingQueue; import org.slf4j.Logger; @@ -46,7 +47,7 @@ public class ShowupSiteUi extends AbstractSiteUi { } else { BlockingQueue queue = new LinkedBlockingQueue<>(); try { - new Thread(() -> { + CompletableFuture.runAsync(() -> { // login with external browser window try { new ShowupElectronLoginDialog(site.getHttpClient().getCookieJar()); @@ -61,7 +62,7 @@ public class ShowupSiteUi extends AbstractSiteUi { LOG.error("Error while signaling termination", e); Thread.currentThread().interrupt(); } - }).start(); + }); queue.take(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 738188c5..11485d5e 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -497,9 +498,9 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void openContactSheet(JavaFxRecording recording) { if (config.getSettings().localRecording) { - recording.getContactSheet().ifPresent(f -> new Thread(() -> DesktopIntegration.open(f)).start()); + recording.getContactSheet().ifPresent(f -> CompletableFuture.runAsync(() -> DesktopIntegration.open(f))); } else { - recording.getContactSheet().ifPresent(f -> new Thread(() -> { + recording.getContactSheet().ifPresent(f -> CompletableFuture.runAsync(() -> { File target; try { target = File.createTempFile("cs_", ".jpg"); @@ -517,7 +518,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e) { Dialogs.showError(getTabPane().getScene(), "Download Error", "An error occurred while downloading the contact sheet", e); } - }).start()); + })); } } @@ -527,7 +528,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { Optional newNote = Dialogs.showTextInput(source.getScene(), "Recording Notes", "", notes); if (newNote.isPresent()) { table.setCursor(Cursor.WAIT); - Thread backgroundThread = new Thread(() -> { + CompletableFuture.runAsync(() -> { List exceptions = new ArrayList<>(); try { recording.setNote(newNote.get()); @@ -543,13 +544,12 @@ public class RecordingsTab extends Tab implements TabSelectionListener { }); } }); - backgroundThread.start(); } } private void pin(List recordings) { table.setCursor(Cursor.WAIT); - Thread backgroundThread = new Thread(() -> { + CompletableFuture.runAsync(() -> { List exceptions = new ArrayList<>(); try { for (JavaFxRecording javaFxRecording : recordings) { @@ -570,12 +570,11 @@ public class RecordingsTab extends Tab implements TabSelectionListener { }); } }); - backgroundThread.start(); } private void unpin(List recordings) { table.setCursor(Cursor.WAIT); - Thread backgroundThread = new Thread(() -> { + CompletableFuture.runAsync(() -> { List exceptions = new ArrayList<>(); try { for (JavaFxRecording javaFxRecording : recordings) { @@ -596,7 +595,6 @@ public class RecordingsTab extends Tab implements TabSelectionListener { }); } }); - backgroundThread.start(); } private void jumpToNextModel(KeyCode code) { @@ -647,11 +645,11 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void onOpenDirectory(JavaFxRecording first) { File tsFile = first.getAbsoluteFile(); - new Thread(() -> DesktopIntegration.open(tsFile.getParent())).start(); + CompletableFuture.runAsync(() -> DesktopIntegration.open(tsFile.getParent())); } private void triggerPostProcessing(List recs) { - new Thread(() -> { + CompletableFuture.runAsync(() -> { for (JavaFxRecording rec : recs) { try { recorder.rerunPostProcessing(rec.getDelegate()); @@ -660,7 +658,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { LOG.error("Error while starting post-processing", e1); } } - }).start(); + }); } private void download(Recording recording) { @@ -796,7 +794,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private void deleteAsync(List recordings) { - Thread deleteThread = new Thread(() -> { + CompletableFuture.runAsync(() -> { recordingsLock.lock(); try { List deleted = new ArrayList<>(); @@ -822,7 +820,6 @@ public class RecordingsTab extends Tab implements TabSelectionListener { Platform.runLater(() -> table.setCursor(Cursor.DEFAULT)); } }); - deleteThread.start(); } public void saveState() { diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java b/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java index aa2df6ee..8ae9a2f6 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java @@ -484,7 +484,7 @@ public class ThumbCell extends StackPane { void pauseResumeAction(boolean pause) { setCursor(Cursor.WAIT); - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { if (pause) { recorder.suspendRecording(model); @@ -504,11 +504,11 @@ public class ThumbCell extends StackPane { } finally { Platform.runLater(() -> setCursor(Cursor.DEFAULT)); } - }).start(); + }); } private void startStopActionAsync(Model model, boolean start) { - new Thread(() -> { + CompletableFuture.runAsync(() -> { try { if (start) { recorder.startRecording(model); @@ -523,7 +523,7 @@ public class ThumbCell extends StackPane { } finally { Platform.runLater(() -> setCursor(Cursor.DEFAULT)); } - }).start(); + }); } CompletableFuture follow(boolean follow) {