# Creating Threads ## Method 1: Thread Class Extend ```java class PrintNumbers extends Thread { private int start, end; PrintNumbers(int start, int end) { this.start = start; this.end = end; } @Override public void run() { for (int i = start; i <= end; i++) { System.out.println(getName() + ": " + i); } } } PrintNumbers t1 = new PrintNumbers(1, 5); PrintNumbers t2 = new PrintNumbers(6, 10); t1.setName("Thread-1"); t2.setName("Thread-2"); t1.start(); t2.start(); ``` ## Method 2: Runnable Interface ```java class PrintEven implements Runnable { @Override public void run() { for (int i = 2; i <= 20; i += 2) System.out.println("Even: " + i); } } Thread t = new Thread(new PrintEven(), "EvenThread"); t.start(); ``` ## Method 3: Lambda (Java 8+) ```java Thread t = new Thread(() -> { for (int i = 1; i <= 5; i++) System.out.println("Lambda thread: " + i); }, "LambdaThread"); t.start(); ``` ## Method 4: Callable + FutureTask Return value chahiye ho. ```java import java.util.concurrent.*; Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 100; i++) sum += i; return sum; }; FutureTask<Integer> future = new FutureTask<>(task); Thread t = new Thread(future); t.start(); int result = future.get(); // Blocking, wait for result System.out.println("Sum: " + result); // 5050 ``` ## Method 5: ExecutorService (Recommended) ```java ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 0; i < 5; i++) { final int taskId = i; executor.submit(() -> System.out.println("Task " + taskId + " by " + Thread.currentThread().getName())); } executor.shutdown(); ``` ## Runnable vs Callable | | Runnable | Callable | |--|--|--| | Return | void | V (generic) | | Exception | Checked nahi | Checked allowed | | Method | run() | call() |