Concurrency in Java example

Rowan 174 Published: 11/05/2024

Concurrency in Java example

Concurrency! A fascinating topic in the realm of programming.

In Java, concurrency is achieved through the use of multiple threads that can execute concurrently. This allows your program to perform multiple tasks simultaneously, improving overall performance and responsiveness.

Here's a simple example of concurrency in Java:

import java.util.concurrent.*;

public class ConcurrencyExample {

public static void main(String[] args) throws InterruptedException, ExecutionException {

// Create an ExecutorService with 5 threads

ExecutorService executor = Executors.newFixedThreadPool(5);

// Define tasks to be executed concurrently

Callable task1 = () -> {

Thread.sleep(2000); // Simulate some work

return "Task 1 completed";

};

Callable task2 = () -> {

Thread.sleep(3000); // Simulate some other work

return "Task 2 completed";

};

Callable task3 = () -> {

Thread.sleep(1000); // Simulate some more work

return "Task 3 completed";

};

// Submit tasks to the executor and get a Future for each

Future future1 = executor.submit(task1);

Future future2 = executor.submit(task2);

Future future3 = executor.submit(task3);

// Wait for all tasks to complete

String result1 = future1.get();

String result2 = future2.get();

String result3 = future3.get();

System.out.println(result1);

System.out.println(result2);

System.out.println(result3);

// Shutdown the executor when done

executor.shutdown();

}

}

In this example, we create an ExecutorService with 5 threads using the newFixedThreadPool method. We then define three tasks that will be executed concurrently: task1, task2, and task3.

Each task simulates some work by sleeping for a specified amount of time using the Thread.sleep method. When each task completes, it returns a string indicating its completion.

We submit these tasks to the executor using the submit method, which returns a Future object that represents the execution of the task. We can then use this Future to get the result of the task when it completes by calling the get method.

In our example, we wait for all three tasks to complete by calling future1.get(), future2.get(), and future3.get() in succession. Finally, we print out the results of each task.

When you run this program, you'll see that the tasks are executed concurrently, with each one taking its own amount of time to complete. This demonstrates how concurrency can be used to improve the performance and responsiveness of your Java programs.

Remember to always shut down your ExecutorService when you're done using it, as shown in the example above. This ensures that any remaining tasks are properly terminated and resources are released.

Java concurrency geeksforgeeks tutorial

I'd be happy to provide a Java Concurrency tutorial for you!

Java has several features that make it well-suited for writing multithreaded programs. The most important one is the Thread class, which represents an individual thread of execution.

Here are some key concepts:

1. Thread Creation and Management

In Java, a thread can be created using either the run() method or by extending the Thread class and implementing its run() method. The run() method is called when the thread starts executing.

Here's an example of how to create a new thread:

public class MyThread extends Thread {

public void run() {

System.out.println("Hello from myThread!");

}

}

And here's how you can use it:

MyThread myThread = new MyThread();

myThread.start(); // starts the thread

2. Synchronization

Concurrent access to shared data by multiple threads can be problematic if not handled properly. Java provides several synchronization constructs, including:

Synchronized Methods: These are methods that can only be accessed by one thread at a time. To declare a synchronized method, you need to add the synchronized keyword to the method declaration. Synchronized Blocks: These are blocks of code that can only be executed by one thread at a time. You can create a synchronized block using the synchronized statement and locking on an object.

Here's an example of how you could use synchronization:

public class BankAccount {

private int balance;

public void deposit(int amount) {

synchronized (this) { // locks this instance

balance += amount;

}

}

public int getBalance() {

return balance;

}

}

3. Inter-thread Communication

Threads can communicate with each other in several ways:

Thread.stop(): This method is used to stop a thread from running. Thread.interrupt(): This method is used to interrupt a thread's execution. Locks and Condition Variables: Java provides the Lock class and its subclasses, as well as the Condition interface. These are used to achieve inter-thread communication.

Here's an example of how you could use condition variables:

import java.util.concurrent.locks.*;

public class ProducerConsumer {

private final Lock lock = new ReentrantLock();

private final Condition producerCondition = lock.newCondition();

private final Condition consumerCondition = lock.newCondition();

public void produce() {

lock.lock();

try {

while (!produceSomething()) {

producerCondition.await();

}

} finally {

lock.unlock();

}

}

public void consume() {

lock.lock();

try {

while (!consumeSomething()) {

consumerCondition.await();

}

} finally {

lock.unlock();

}

}

}

4. Thread Pools

Java provides an implementation of the Executor interface, which represents a pool of threads that can be used to execute tasks in parallel. You can use this pool by creating an instance of ExecutorService and submitting your task for execution.

Here's an example of how you could use thread pools:

import java.util.concurrent.*;

public class MyThreadPool {

public static void main(String[] args) {

ExecutorService executor = Executors.newFixedThreadPool(4); // creates a pool with 4 threads

for (int i = 0; i < 10; i++) {

final int taskNumber = i;

executor.submit(() -> System.out.println("Task " + taskNumber + " is being executed"));

}

}

}

These are some of the main concepts and techniques related to Java concurrency. You can learn more about each topic by exploring the API documentation or searching for tutorials online.

I hope this helps!