如果在Java多线程处理中传递executorService执行调用中的线程,会发生什么
请参见以下两个示例: 示例1如果在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
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的功能添加任何内容。