当前位置: 首页 > 知识库问答 >
问题:

理解线程Hibernate和创建

阳兴文
2023-03-14

我在每次迭代中都创建一个新线程。并且每个线程都在创建后立即启动。线程调用一个方法“doSomething()”,该方法Hibernate1秒并打印到控制台。我还在for循环中启动线程后打印一条语句,但在打印一次之后,它会在创建所有线程之前先打印所有这些语句。

public class LogginWidget extends Widget {
    @Override
    public synchronized void doSomething() throws InterruptedException {
        System.out.println("LogginWidget-" + Thread.currentThread().getName());
        super.doSomething();
        Thread.sleep(1000);
    }

    public static void main(String[] args) {
        LogginWidget widget = new LogginWidget();
        for (int i = 0; i < 10; i++) {
            Thread thread1 = new Thread(() -> {
                try {
                    widget.doSomething();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            thread1.setName("thread-" + i);
            thread1.start();
            System.out.println("After starting the thread==" + i);
        }
    }
}

输出看起来像-

**After starting the thread==0
LogginWidget-thread-0
Calling from widget class.
Widgetthread-0
After starting the thread==1
After starting the thread==2
After starting the thread==3
After starting the thread==4
After starting the thread==5
After starting the thread==6
After starting the thread==7
After starting the thread==8
After starting the thread==9
LogginWidget-thread-9
Calling from widget class.
Widgetthread-9
LogginWidget-thread-8
Calling from widget class.
Widgetthread-8
LogginWidget-thread-5
Calling from widget class.
Widgetthread-5
LogginWidget-thread-4
Calling from widget class.
Widgetthread-4**

我在想为什么它会输出成这样?为什么在启动thread==“+i”语句之前打印“system.out.println(”“在启动thread==”+i“语句之后,同时如果也创建了线程,那么这些线程存储在哪里?或者线程是以后创建的?它是怎么工作的..谁能解释一下吗?

共有1个答案

路奇
2023-03-14

线程生命周期记录在java.lang.Thread Javadoc中。重要的是,一旦一个线程启动,它就会停止应用程序退出,直到它完成执行(除非它是一个守护进程线程)-

当一个Java虚拟机启动时,通常有一个单一的非守护进程线程(典型地调用某个指定类的名为main的方法)。Java虚拟机继续执行线程,直到出现以下任一种情况:类运行时的exit方法已经调用,并且安全管理器已经允许exit操作发生。不是后台进程线程的所有线程都已死亡,要么是从对run方法的调用返回,要么是抛出一个传播到run方法之外的异常。

许多好的建议在回答其他问题在Java的so-threads。

无法保证执行线程的顺序(除非您编写代码以确保特定的执行顺序)--您可能会发现,如果您运行代码的次数足够多,输出就会有微妙的不同,可能每次都是如此。

 类似资料:
  • 本文向大家介绍java 线程创建多线程详解,包括了java 线程创建多线程详解的使用技巧和注意事项,需要的朋友参考一下 Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.sta

  • 我需要执行父任务,父任务可能有子任务,也可能没有子任务。每个父任务和子任务都应该在线程中运行。如果父任务或子任务执行中出现错误,则必须回滚父任务和子任务的事务。我正在使用hibernate4。

  • 我想更多地了解线程睡眠解析是如何工作的,以及它与睡眠()解析之外的内容有什么联系。 我知道它是由操作系统定义的,而在Windows上通常是15ms。我最近环顾四周无法确认这一点,但我依稀记得这个15ms是由操作系统循环的,并且对所有线程都是“全局的”,这意味着15ms不是线程可以Hibernate的最短时间,而是最大Hibernate时间(1)。对吗?所有操作系统都一样吗(超过持续时间)? 我想不

  • 本文向大家介绍理解iOS多线程应用的开发以及线程的创建方法,包括了理解iOS多线程应用的开发以及线程的创建方法的使用技巧和注意事项,需要的朋友参考一下 一、进程和线程 1.什么是进程   进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ、Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程

  • 本文向大家介绍python程序 创建多线程过程详解,包括了python程序 创建多线程过程详解的使用技巧和注意事项,需要的朋友参考一下 一、python线程的模块 1.1 thread和threading模块 thread模块提供了基本的线程和锁的支持 threading提供了更高级别、功能更强的线程管理的功能。 1.2 Queue模块 Queue模块允许用户创建一个可以用于多个线程之间共享数据的

  • 问题内容: 我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都使用一个或多个DAO(某些DAO可以同时被多个线程使用)。Spring 将所有DAO注入()到我的线程类中。每个DAO也接受注射。 什么是在这些多个DAO之间管理Hibernate会话的正确方法,这样我就不会因多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一会话)? 我在Hibe