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

标签 java

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

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()的线程

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");

    }
}

现在让我很困惑的是,当我尝试在像

这样的循环中创建线程时
for (int i = 0; i < 10; i ++) {
            Transferable t1 = new Transferable(service);
            t1.run();
            Thread.sleep(10);
        }

那么service中的callMethod()就会依次执行,不会互相影响(也不会抛出错误信息)

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

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

最佳答案

有很多因素会影响您的两个示例的行为。

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

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

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

关于java - 当我在循环中创建线程时,它是真正的多线程吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43199219/

相关文章:

java - Mockito:在 X 调用上返回 NULL

JavaBeans 组件 java.lang.NullPointerException

java - 如何实现 View 幻灯片

java - 具有一个指针的 FIFO 队列

java - Spring boot webflux应用程序不会启动IllegalStateException

java - 递归获取列表元素

使用 Flyway 运行测试并在 Docker 容器内嵌入 Postgresql 时出现 java.net.ConnectException

java - 获取上个月的最后日期

java - 具有多个类型参数的通用辅助方法

java - FTPClient 无法打开文件,没有那个文件或目录