java中创建和启动多线程程序的核心方法有两种:1. 实现runnable接口,将任务逻辑与线程解耦,便于任务复用和线程池管理;2. 继承thread类,直接定义线程行为,但受限于java单继承机制。应优先选择实现runnable接口,因其更符合单一职责原则且灵活性更高。启动线程必须调用start()方法,它会由jvm创建新线程并异步执行run()中的任务;若直接调用run(),则仅作为普通方法在当前线程同步执行,无法实现并发。线程生命周期包括五种状态:new(新建)、runnable(可运行)、blocked(阻塞)、waiting(无限等待)、timed_waiting(限时等待)和terminated(终止),理解这些状态有助于分析和调试多线程程序的执行行为。

Java中创建和启动多线程程序,核心在于定义好线程要执行的任务,然后通过
Thread
Runnable
Thread
Thread
start()
创建和启动多线程程序,我们通常会选择以下两种路径:
1. 实现 Runnable
立即学习“Java免费学习笔记(深入)”;
这是更推荐的方式,因为它将任务(
Runnable
Thread
Runnable
定义任务: 创建一个类实现
Runnable
run()
run()
class MyRunnableTask implements Runnable {
private String taskName;
public MyRunnableTask(String name) {
this.taskName = name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 正在执行任务: " + taskName);
try {
// 模拟任务执行耗时
Thread.sleep(100 + (long)(Math.random() * 500));
} catch (InterruptedException e) {
System.out.println(taskName + " 被中断了!");
Thread.currentThread().interrupt(); // 重新设置中断状态
}
System.out.println(Thread.currentThread().getName() + " 完成了任务: " + taskName);
}
}创建并启动线程: 实例化
MyRunnableTask
Thread
Thread
start()
public class ThreadWithRunnableDemo {
public static void main(String[] args) {
System.out.println("主线程开始...");
// 创建Runnable任务实例
Runnable task1 = new MyRunnableTask("下载文件A");
Runnable task2 = new MyRunnableTask("处理数据B");
Runnable task3 = new MyRunnableTask("发送邮件C");
// 创建Thread实例并传入Runnable任务
Thread thread1 = new Thread(task1, "工作线程-1");
Thread thread2 = new Thread(task2, "工作线程-2");
Thread thread3 = new Thread(task3, "工作线程-3");
// 启动线程
thread1.start();
thread2.start();
thread3.start();
System.out.println("主线程继续执行,不再等待子线程...");
// 主线程可以继续做自己的事情
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束。");
}
}2. 继承 Thread
这种方式更直接,但由于Java的单继承特性,你的任务类就不能再继承其他类了。
定义任务: 创建一个类继承
Thread
run()
class MyThread extends Thread {
private String taskName;
public MyThread(String name) {
super(name); // 调用父类构造器设置线程名
this.taskName = name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 正在执行任务: " + taskName);
try {
// 模拟任务执行耗时
Thread.sleep(50 + (long)(Math.random() * 300));
} catch (InterruptedException e) {
System.out.println(taskName + " 被中断了!");
Thread.currentThread().interrupt();
}
System.out.println(Thread.currentThread().getName() + " 完成了任务: " + taskName);
}
}创建并启动线程: 直接实例化
MyThread
start()
public class ThreadExtendsDemo {
public static void main(String[] args) {
System.out.println("主线程开始...");
// 创建MyThread实例
MyThread threadA = new MyThread("独立线程-A");
MyThread threadB = new MyThread("独立线程-B");
// 启动线程
threadA.start();
threadB.start();
System.out.println("主线程继续执行...");
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程结束。");
}
}这确实是个老生常谈的问题,但对于初学者来说,弄清楚它至关重要。简单来说,
Runnable
Thread
Runnable
Runnable
Thread
Thread
Runnable
Runnable
Runnable
相比之下,继承
Thread
Thread
Thread
所以,我的建议是:
Runnable
Thread
Thread
从我的个人经验来看,当你开始接触更高级的并发工具,比如
ExecutorService
Runnable
Callable
Runnable
这是一个非常常见的误区,也是初学者经常会犯的错误。直观上,我们看到
run()
start()
run()
当你调用一个
Thread
start()
start()
run()
start()
而如果你直接调用
run()
run()
run()
run()
run()
run()
想象一下,你有一个快递员(线程),他需要去送包裹(任务)。
start()
run()
所以,要真正实现多线程和并发,
start()
理解线程的生命周期和状态对于调试和优化多线程程序至关重要。一个线程从诞生到消亡,会经历不同的状态。Java的
Thread.State
NEW (新建):
new Thread()
start()
RUNNABLE (可运行/运行中):
start()
Runnable
Runnable
BLOCKED (阻塞):
synchronized
BLOCKED
WAITING (等待):
WAITING
Object.wait()
wait()
WAITING
Thread.join()
join()
join
LockSupport.park()
java.util.concurrent
TIMED_WAITING (有时限等待):
WAITING
TIMED_WAITING
Thread.sleep(long millis)
Object.wait(long timeout)
Thread.join(long millis)
join
LockSupport.parkNanos(Object blocker, long nanos)
LockSupport.parkUntil(long deadline)
TERMINATED (终止):
run()
TERMINATED
TERMINATED
start()
IllegalThreadStateException
这些状态构成了线程的完整生命周期。理解它们,能帮助我们更好地分析线程的运行情况,比如为什么某个线程“卡住”了(可能是
BLOCKED
WAITING
start()
run()
jstack
以上就是java怎样创建和启动多线程程序 java多线程编程的基础操作方法的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号