Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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多线程处理中传递executorService执行调用中的线程,会发生什么_Java_Multithreading - Fatal编程技术网

如果在Java多线程处理中传递executorService执行调用中的线程,会发生什么

如果在Java多线程处理中传递executorService执行调用中的线程,会发生什么,java,multithreading,Java,Multithreading,请参见以下两个示例: 示例1 public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newCachedThreadPool(); Thread thread1 = new Thread(new Runnable() { @Override pu

请参见以下两个示例:

示例1

public static void main(String[] args) throws InterruptedException {

ExecutorService executorService = Executors.newCachedThreadPool();
        
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                //work
                for (int i = 0 ; i < 5 ; i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        executorService.execute(thread1);
        executeService.shutdown();
}
publicstaticvoidmain(String[]args)抛出InterruptedException{
ExecutorService ExecutorService=Executors.newCachedThreadPool();
Thread thread1=新线程(new Runnable(){
@凌驾
公开募捐{
//工作
对于(int i=0;i<5;i++){
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
executorService.execute(线程1);
executeService.shutdown();
}
示例2

public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newCachedThreadPool();

        executorService.execute(new Runnable() {
            @Override
            public void run() {
                //work
                for (int i = 0 ; i < 5 ; i++){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        executeService.shutdown();
    }
publicstaticvoidmain(String[]args)抛出InterruptedException{
ExecutorService ExecutorService=Executors.newCachedThreadPool();
executorService.execute(新的Runnable(){
@凌驾
公开募捐{
//工作
对于(int i=0;i<5;i++){
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
executeService.shutdown();
}
两种情况下的结果都是一样的,但我的一个朋友在StackOverflow()的评论中说

executorService是treads的替代品。在executorService中放置线程是没有意义的。首先,创建Runnable,然后将其作为参数放入线程并启动该线程,或者将该Runnable提交给executorService


我希望我的问题很清楚,所以请告诉我将runnable传递给ExecuteService与将thread传递给ExecuteService的区别。

线程实现runnable
,因此执行器服务将接受它作为一个简单的
runnable
,并因此调用
thread.run()
方法

这意味着
线程
本身永远不会启动,除非您自己调用它的
start()
方法,在这种情况下,结果肯定是未定义的


因此,您可以说代码片段的行为是相同的,您只需将
Runnable
传递给
ExecutorService
,然后调用
Runnable.run()
方法来执行它。

线程实现Runnable
,因此excutor服务将其作为简单的
Runnable
接受,并因此调用
Thread.run()
方法

这意味着
线程
本身永远不会启动,除非您自己调用它的
start()
方法,在这种情况下,结果肯定是未定义的


因此,您可以说代码段的行为是相同的,您只是将
Runnable
传递给
ExecutorService
,然后调用
Runnable.run()
方法执行它。

在您的示例中,您不启动线程,因此它没有做任何特殊的事情。在您的示例中,它只是一个普通对象,使用ExecutorSevice将调用的
run()
方法实现了
Runnable
类型。
Thread
实现了
Runnable
,因此执行器将只执行其
run
方法,而不是任何其他
Thread
特定的方法(和
Thread#run
只是委托给给定的
Runnable
)。意思是,是的,你的朋友是对的:)在你的例子中,你没有启动线程,所以它没有做任何特殊的事情。在您的示例中,它只是一个普通对象,使用ExecutorSevice将调用的
run()
方法实现了
Runnable
类型。
Thread
实现了
Runnable
,因此执行器将只执行其
run
方法,而不是任何其他
Thread
特定的方法(和
Thread#run
只是委托给给定的
Runnable
)。意思是,是的,你的朋友是对的:)这意味着工作只在主线程中完成?@VijayJangid,这取决于
ExecutorService
-实现decide@VijayJangid在这两种情况下,工作都是在executor服务中自己的线程上完成的。在这两种情况下,都会执行Runnable。但是当你提交一个线程时,你会用一个thread对象包装这个Runnable,这只会浪费它的内存,不会给Runnable的功能增加任何东西。这意味着工作只在主线程中完成?@VijayJangid,这取决于
ExecutorService
-实现decide@VijayJangid在这两种情况下,该工作是在executor服务中自己的线程上完成的。在这两种情况下,都会执行Runnable。但是,当您提交一个线程时,您会使用一个thread对象包装该Runnable,这只会浪费它的内存,并且不会给Runnable的功能添加任何内容。