Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在另一个线程中使用线程是一种好的做法吗?_Java_Multithreading - Fatal编程技术网

Java 在另一个线程中使用线程是一种好的做法吗?

Java 在另一个线程中使用线程是一种好的做法吗?,java,multithreading,Java,Multithreading,根据标题,查看以下代码: Thread outer = new Thread(new Runnable() { @Override public void run() { Thread inner1 = new Thread(new Runnable() { @Override public void run() {

根据标题,查看以下代码:

Thread outer = new Thread(new Runnable() {
            @Override
            public void run() {
                Thread inner1 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //some statements and other inner threads
                    }
                });

                Thread inner2 = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //some statements and other inner threads
                    }
                });

                //some statements and other inner threads
            }
        });
那么,像这样使用多线程是一种好的实践吗


根据第1季度的情况来看是不是很好。这是正确的,但是仅仅为了创建另一个线程而创建一个威胁没有多大意义

另外,请记住,创建线程对象是一个相对昂贵的操作。
代码中有//一些语句和其他内部线程注释。考虑使用以避免手动创建多个线程。

< P>根据Q1是好的。这是正确的,但是仅仅为了创建另一个线程而创建一个威胁没有多大意义

另外,请记住,创建线程对象是一个相对昂贵的操作。 代码中有//一些语句和其他内部线程注释。考虑使用以避免手动创建多个线程。

本文对并发性有一些建议。我建议您完整阅读,但这里有两个重要的片段:

通常,不建议使用Thread类的实例直接创建和管理线程

这是:

用Java创建新线程很容易,但管理它们确实很困难 艰苦的Java标准库在中提供了非常有用的抽象 以简化线程为目标的执行器和线程池的形式 管理层

本质上,在最简单的实现中,线程池创建 维护线程列表,可以立即使用。 应用程序,而不是每次产生新线程,只是借用 池中的一个或多个。借来的线 完成其工作后,它将返回池中,并成为 可用于接下一个任务

尽管可以直接使用线程池,但Java标准 库提供了一个具有一组工厂方法的外观 创建常用的线程池配置

线程有很多状态需要管理,这在本文中也有说明:

新建:尚未启动的线程处于此状态。 RUNNABLE:Java虚拟机中执行的线程处于此状态。 阻塞:在等待监视器锁定时被阻塞的线程处于此状态。 等待:无限期等待另一个线程执行特定操作的线程处于此状态。 TIMED_WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。 已终止:已退出的线程处于此状态。 以下是以下答案中的其他注意事项:

是的,您可以根据需要启动任意多个线程,但这很可能是错误的 这不是最好的方式。最好使用非阻塞API的 这样您就可以开始执行一些外部调用和 线程可以立即开始执行其他操作,而无需等待 要返回的套接字/数据库调用。然后,当套接字/数据库 调用返回时,将触发回调以完成该处理

非阻塞I/O可以提供更高的CPU利用率,因为 只是触发呼叫和注册回调,而不必尝试 平衡适当数量的并发线程,这些线程主要是 反正就是睡觉

等级制度重要吗

您最好使用带有缓存的ExecutorService 线程池

通过这种方式,您可以将线程集中在一起,而不是创建大量 昂贵的ExecutorServices还提供其他很酷的东西,并使用 使用它们的可调用项/可运行项可能比 你自己用线胡闹

这篇关于并发性的文章为您提供了一些建议。我建议您完整阅读,但这里有两个重要的片段:

通常,不建议使用Thread类的实例直接创建和管理线程

这是:

用Java创建新线程很容易,但管理它们确实很困难 艰苦的Java标准库在中提供了非常有用的抽象 以简化线程为目标的执行器和线程池的形式 管理层

本质上,在最简单的实现中,线程池创建 维护线程列表,可以立即使用。 应用程序,而不是每次产生新线程,只是借用 池中的一个或多个。借来的线 完成其工作后,它将返回池中,并成为 可用于接下一个任务

尽管可以直接使用线程池,但Java标准 库提供了一个具有一组工厂方法的外观 创建常用的线程池配置

线程有很多状态需要管理,这在本文中也有说明:

新建:尚未启动的线程处于此状态。 可运行的:线程 在Java虚拟机中执行时处于此状态。 阻塞:在等待监视器锁定时被阻塞的线程处于此状态。 等待:无限期等待另一个线程执行特定操作的线程处于此状态。 TIMED_WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。 已终止:已退出的线程处于此状态。 以下是以下答案中的其他注意事项:

是的,您可以根据需要启动任意多个线程,但这很可能是错误的 这不是最好的方式。最好使用非阻塞API的 这样您就可以开始执行一些外部调用和 线程可以立即开始执行其他操作,而无需等待 要返回的套接字/数据库调用。然后,当套接字/数据库 调用返回时,将触发回调以完成该处理

非阻塞I/O可以提供更高的CPU利用率,因为 只是触发呼叫和注册回调,而不必尝试 平衡适当数量的并发线程,这些线程主要是 反正就是睡觉

等级制度重要吗

您最好使用带有缓存的ExecutorService 线程池

通过这种方式,您可以将线程集中在一起,而不是创建大量 昂贵的ExecutorServices还提供其他很酷的东西,并使用 使用它们的可调用项/可运行项可能比 你自己用线胡闹


在任何编程语言中都没有内部线程。线程只是具有run方法的对象,其特点是多个线程可以同时运行

在您的示例中,您在线程的run方法中创建了两个线程。这不是问题,因为您可以在任何上下文中创建对象


如果要使用线程,必须在创建线程后调用outer.start、inner1.start和inner2.start,否则不会执行这些线程。同样,这也很好,因为线程在哪个上下文中启动并不重要;Java虚拟机平等地对待所有线程。

在任何编程语言中都没有内部线程。线程只是具有run方法的对象,其特点是多个线程可以同时运行

在您的示例中,您在线程的run方法中创建了两个线程。这不是问题,因为您可以在任何上下文中创建对象


如果要使用线程,必须在创建线程后调用outer.start、inner1.start和inner2.start,否则不会执行这些线程。同样,这也很好,因为线程在哪个上下文中启动并不重要;Java虚拟机平等对待所有线程。

我不喜欢这种方式,因为:

*可读性较差

*除非您不手动设置,否则线程2将自动选择线程1的优先级

*基于JVM的线程调度程序,如时间片、队列。。。因此,您不知道线程1何时将通过可运行状态


*如果线程2依赖于线程1,您可以使用等待和通知或其他新功能来实现此目标,这样它将更具可读性

我不喜欢这种方式,因为:

*可读性较差

*除非您不手动设置,否则线程2将自动选择线程1的优先级

*基于JVM的线程调度程序,如时间片、队列。。。因此,您不知道线程1何时将通过可运行状态


*如果线程2依赖于线程1,您可以使用“等待并通知”或其他新功能来实现此目标,因此它将更具可读性

请尝试每个问题只回答一个问题。@Kayaman抱歉。。。我只是不想发3个帖子。不过,如果不好,我会编辑它,再发两篇帖子。我应该这样做吗?目前的问题太多,无法正确回答。@HMD几乎没有“最好”的方法。这完全是编码风格、个人偏好和上下文的问题。答案是否定的,根据定义,这是否是不好的做法。我可以想到许多例子,在这些例子中,这段代码会很好。我还可以想到很多情况下,这段代码会很糟糕。在某种程度上,您实际上总是从其他线程创建一个线程。在主线程上调用程序的main方法。从那里开始运行其他线程。线程不是嵌套的,它们是并行运行的,不管你从哪里调用它们。请尽量坚持每个问题一个问题。@Kayaman抱歉。。。我只是不想发3个帖子。不过,如果不好,我会编辑它,再发两篇帖子。我应该这样做吗?目前的问题太多,无法正确回答。@HMD几乎没有“最好”的方法。这完全是编码风格、个人偏好和上下文的问题。答案是否定的,根据定义,这是否是不好的做法。我可以想到许多例子,其中这段代码是j
很好。我还可以想到很多情况下,这段代码会很糟糕。在某种程度上,您实际上总是从其他线程创建一个线程。在主线程上调用程序的main方法。从那里开始运行其他线程。线程不是嵌套的,它们是并行运行的,无论从何处调用它们。通常,不建议使用Thread类的实例直接创建和管理线程。在我看来,这是一个错误的建议。如果您想要一个长期运行的、专门化的线程,那么实例化线程是获得线程的最简单方法。不过,在某些情况下,您可能希望使用ThreadFactory来代替。现在,我们可以讨论您是否需要一个长期运行的、专门化的线程,但这是一个不同的讨论主题。我不知道在考虑线程生命周期、资源管理、耐久性、监控、标准化/易读性等方面的权衡时,它是否更简单,etc.是一个关于单线程与Executor库的有趣答案。另外,直接从Oracle获得的是一个始终首选并发程序包的方法。通常,不建议使用Thread类的实例直接创建和管理线程。在我看来,这是一个错误的建议。如果您想要一个长期运行的、专门化的线程,那么实例化线程是获得线程的最简单方法。不过,在某些情况下,您可能希望使用ThreadFactory来代替。现在,我们可以讨论您是否需要一个长期运行的、专门化的线程,但这是一个不同的讨论主题。我不知道在考虑线程生命周期、资源管理、耐久性、监控、标准化/易读性等方面的权衡时,它是否更简单,etc.是一个关于单线程与Executor库的有趣答案。另外,直接从Oracle获得的是一个始终首选并发程序包的工具。