首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:多线程

Java:多线程
EN

Stack Overflow用户
提问于 2016-05-18 19:42:32
回答 2查看 254关注 0票数 2

为什么A类的线程一直等到B类的线程结束?在本示例中,代码打印System.out.println从不执行。我怎么才能解决这个问题?

代码语言:javascript
运行
复制
public class A implements Runnable {
    public A() {
        Thread t = new Thread(this);
        t.start();

    }
    public static void main(String[] args) {
        A tmp = new A();
    }
    public void run() {

        B tmp = new B();
        tmp.run();

        System.out.println("Hello");
    }
}
class B implements Runnable {
    public B() {
    }
    public void run() {
        while (true) {
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-04 06:59:52

代码语言:javascript
运行
复制
tmp.run(); 

在主线程中运行,而不是在单独的Thread中运行,因为您没有将B作为单独的线程启动。

以上一行应改为

代码语言:javascript
运行
复制
new Thread(tmp).start();

您已经正确地启动了线程A(通过使用start()方法),并且没有复制线程B。

请参阅关于在两个方法中启动线程的oracle文档链接:

  1. 提供一个可运行的对象:Runnable接口定义一个方法run,用于包含线程中执行的代码。
  2. 子类Thread: Thread类本身实现Runnable,尽管它的run方法什么也不做。应用程序可以子类线程,提供自己的运行实现

另外,线程B在无限循环中运行,没有退出条件。如果不是有意的,那么在run()方法中添加一个退出条件。

票数 3
EN

Stack Overflow用户

发布于 2016-05-18 19:45:09

这段代码:

代码语言:javascript
运行
复制
B tmp = new B();
tmp.run();

System.out.println("Hello");

不会启动线程。只有一个线程生成,它调用b.run()。所以线程a只是挂在b.run()中的无穷无尽的循环中。只需为可运行的“b”创建另一个线程即可,一切都应如预期的那样工作:

代码语言:javascript
运行
复制
public void run() {

    Thread t = new Thread(new B());
    t.start();

    System.out.println("Hello");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37308765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档