首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在循环中创建线程时,它是真正的多线程吗?

当我在循环中创建线程时,它是真正的多线程吗?
EN

Stack Overflow用户
提问于 2017-04-04 05:50:40
回答 2查看 57关注 0票数 0

我尝试在一个10次循环中创建10个线程,当我没有在方法上分配同步时,我希望看到冲突打印出来。这是我的密码

代码语言:javascript
复制
public class SingletonService {

private static SingletonService singleton = null;


public static SingletonService getInstance() {
    if (singleton == null) {
        synchronized(SingletonService.class) {
            if (singleton == null) {
                singleton = new SingletonService();
                return singleton;
            }
        }
    }

    return singleton;
}

public  void testMethod() {
    boolean flag = true;
    System.out.println("start");
    if (flag == false) {
        System.out.println(">>>>>>>>>>>>>>>Error");
    }
    flag = false;
    System.out.println("over");
}


  }

下面是获取服务并调用testMethod()的线程

代码语言:javascript
复制
public class Transferable extends Thread {

    private SingletonService service = null;

    public Transferable(SingletonService aService) {
        service = aService;
    }

    public void run() {
        System.out.println("Service Start");
        service.testMethod();
        System.out.println("Service End");

    }
}

现在让我很困惑的是,当我试图在循环中创建线程时,

代码语言:javascript
复制
for (int i = 0; i < 10; i ++) {
            Transferable t1 = new Transferable(service);
            t1.run();
            Thread.sleep(10);
        }

然后,服务中的callMethod()将按顺序执行,不会相互影响(错误消息也不会被抛出)

但是当我尝试手动创建线程时,就像

代码语言:javascript
复制
Transferable t1 = new Transferable(service);
Transferable t2 = new Transferable(service);
Transferable t3 = new Transferable(service);
Transferable t4 = new Transferable(service);
Transferable t5 = new Transferable(service);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();

错误信息被打印出来,开始-结束序列也变得混乱.谁能帮我解决问题,把细节说出来?谢谢^BR

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-04 06:20:25

查看Thread java se文档站点https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html,特别是start()方法

start():使该线程开始执行;Java虚拟机调用该线程的run方法。

在循环中调用run()不会导致头执行。相反,run()是在主线程中执行的,这就是为什么执行是顺序的,而不是像您预期的那样并行执行。

请尝试用for循环中的start()替换run()。

票数 1
EN

Stack Overflow用户

发布于 2017-04-04 05:55:09

有许多事情有助于你的两个例子的行为。

首先,SingletonService.testMethod()flag定义为局部变量。因此,它不能真正用作检查线程冲突的标志。我不知道你怎么能得到错误输出。这个标志应该是一个字段。

其次,循环示例调用线程的run()方法,而手动示例调用start()方法。start()将创建一个新线程,然后调用run()方法。run()将简单地在当前线程中执行Transferable.run()方法,从而强制执行顺序操作。

第三,如果您更改了上述内容,那么在每个循环中仍然会有一个Thread.sleep(10)调用,这意味着在启动一个线程和下一个线程之间,您需要等待10毫秒,这已经足够让第一个线程完成了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43199219

复制
相关文章

相似问题

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