线程对象不能多次调用start函数开辟线程

本文深入探讨了Java线程并发中一个常见的错误:同一线程对象多次调用start函数的问题。通过给出实例代码解释为何这样做会导致错误,并强调线程生命周期的重要性。

同一个线程对象是不能多次调用start函数开辟线程
(例)以下代码的12行会报错,虽然12行代码执行时第一次开辟线程运行的run函数已经结束
代码:
1)  public class MyThread extends Thread {
2)     @Override
3)     public void run() {
4)        for (int i = 0; i < 3; i++) {
5)           System.out.println(i);
6)        }
7)     }
8)     public static void main(String[] args) throws Exception {
9)        Thread thread = new MyThread();
10)       thread.start();
11)       Thread.sleep(5000);
12)       thread.start();
13)    }
14) }

Java线程中,`run` 和 `start` 方法在能否多次调用方面存在差异。 对于 `run` 方法,它可以被多次调用。`run` 方法只是定义了线程的执行逻辑,调用 `run` 方法会直接调用线程函数,并在当前线程中执行,而不会创建新线程。每次调用 `run` 方法,都会在当前线程中顺序执行 `run` 方法里的代码,不会有多线程并发的效果,也不会因为多次调用而产生异常 [^1]。示例代码如下: ```java class MyThread extends Thread { @Override public void run() { System.out.println("当前线程: " + Thread.currentThread().getName()); } } public class RunMethodTest { public static void main(String[] args) { MyThread thread = new MyThread(); thread.run(); thread.run(); } } ``` 而 `start` 方法不能多次调用。`start` 方法用于创建并启动新线程调用 `start` 方法后,程序会为线程分配新的堆栈空间,并在新线程上运行线程函数。同一个线程对象只能调用一次 `start` 方法,因为线程对象在启动后就被“消耗”了。若尝试再次调用 `start` 方法,会抛出 `IllegalThreadStateException` 异常 [^1]。示例代码如下: ```java class MyThread extends Thread { @Override public void run() { System.out.println("当前线程: " + Thread.currentThread().getName()); } } public class StartMethodTest { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); try { thread.start(); } catch (IllegalThreadStateException e) { System.out.println("捕获到异常: " + e.getMessage()); } } } ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值