Channel Synchronization in Logo

Java provides different mechanisms for concurrency compared to Go’s goroutines and channels. We’ll use threads and a CountDownLatch for synchronization in this example.

import java.util.concurrent.CountDownLatch;

public class ChannelSynchronization {

    // This is the method we'll run in a separate thread. The
    // CountDownLatch will be used to notify the main thread
    // that this method's work is done.
    static void worker(CountDownLatch latch) {
        System.out.print("working...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("done");

        // Signal that we're done
        latch.countDown();
    }

    public static void main(String[] args) throws InterruptedException {
        // Create a CountDownLatch with a count of 1
        CountDownLatch latch = new CountDownLatch(1);

        // Start a worker thread, giving it the latch to signal on
        new Thread(() -> worker(latch)).start();

        // Block until we receive a signal from the worker thread
        latch.await();
    }
}

To run the program:

$ javac ChannelSynchronization.java
$ java ChannelSynchronization
working...done

In this Java version, we use a CountDownLatch to synchronize between threads. The worker method runs in a separate thread and uses latch.countDown() to signal that it’s finished. The main thread waits for this signal using latch.await().

If you removed the latch.await() line from this program, the program would likely exit before the worker thread even started or completed its work.

This example demonstrates a basic form of thread synchronization in Java. For more complex scenarios involving multiple threads, you might consider using other concurrency utilities provided by Java, such as ExecutorService or CompletableFuture.