C++11简单线程程序转Java时遇构造器参数不匹配报错求助
报错根因定位
你自定义的ManyHellos类仅定义了接收int参数的构造方法public ManyHellos(int count),Java语法规则明确:一旦手动编写了带参构造方法,编译器就不会自动生成默认的无参构造。但你在main方法中实例化时写的是new ManyHellos(),没有传入任何参数,和现有构造方法的签名完全不匹配,因此触发编译报错。
代码逻辑与原始C++版本的偏差
除了构造方法传参的错误,当前Java代码的执行逻辑和原C++示例的并发设计存在本质差异:
- 原C++程序逻辑:一次性启动全部10个子线程→主线程打印自身输出→统一等待所有子线程执行完成,是多线程并发运行的效果
- 你当前Java代码的逻辑:每启动1个线程就立刻调用
join()等待它完全执行结束,再启动下一个线程,实际是串行执行,没有实现多线程并发的预期效果
完整修正方案
- 创建
ManyHellos实例时,将当前循环对应的线程编号i作为参数传入构造方法,匹配已定义的构造方法签名 - 借助数组存储所有已启动的线程实例,等全部线程启动完成后,再统一执行join等待逻辑,还原原C++的并发流程
- 补充Java语法要求的异常处理:
join()方法会抛出受检异常InterruptedException,必须手动捕获处理,否则会触发编译报错
修正后可直接运行的代码
public class ManyHellos implements Runnable { private int threadId; public ManyHellos(int threadId) { this.threadId = threadId; } @Override public void run() { System.out.println("Hello from thread " + threadId); } public static void main(String[] args) { int numThreads = 10; Thread[] threads = new Thread[numThreads]; // 启动所有子线程 for (int i = 0; i < numThreads; i++) { threads[i] = new Thread(new ManyHellos(i)); threads[i].start(); } // 主线程输出自身内容 System.out.println("Hello from main"); // 等待所有子线程执行完成 for (int i = 0; i < numThreads; i++) { try { threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
补充说明:
- Java中
java.lang包下的类是自动导入的,你原代码里写的import java.lang.Thread;属于冗余导入,不影响编译但没有实际作用- 你参考的原始C++代码存在一处笔误:
sstd::thread是多写了一个前缀字符,正确写法为std::thread
内容的提问来源于stack exchange,提问作者Rema Thomas
相关产品推荐
相关产品推荐

