public class ThreadExample implements Runnable {
    private String taskName;
    
    public ThreadExample(String taskName) {
        this.taskName = taskName;
    }
    
    public void run() {
        try {
            System.out.println("Task '" + taskName + "' is running.");
            Thread.sleep(2000); // 模拟任务执行
            System.out.println("Task '" + taskName + "' has completed.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        Thread t1 = new Thread(new ThreadExample("Task 1"));
        Thread t2 = new Thread(new ThreadExample("Task 2"));
        
        t1.start(); // 启动线程t1
        t2.start(); // 启动线程t2
        
        try {
            t1.join(); // 等待线程t1执行完毕
            t2.join(); // 等待线程t2执行完毕
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("All tasks have been completed.");
    }
}

以上代码展示了Java中使用多线程实现任务的并发执行。我们通过实现Runnable接口,并在run方法中编写任务的具体逻辑。首先创建线程t1和t2,然后通过调用start方法启动线程。执行完start后,线程t1和t2会并发执行任务。使用join方法可以等待线程t1和t2执行完毕。

在实际开发中,多线程的应用场景非常广泛。例如,可以使用多线程实现并发处理任务、提高程序运行效率等。在编写多线程代码时,需要注意线程安全和资源共享的问题,确保代码的正确性和性能。