Java两种创建线程方式的区别
创建一个线程
Java 提供了三种创建线程的方法:
-
通过实现 Runnable 接口; 通过继承 Thread 类; 通过 Callable 和 Future 创建线程。
这里只介绍两种第一种和第二种。
1.以创建Runnable接口实例的方式创建线程
public class WelcomApp1 { public static void main(String[] args) { //创建线程 Thread welcomThread = new Thread(new WelcomTask()); //启动线程 welcomThread.start(); System.out.printf("welcom2! Im %s.%n",Thread.currentThread().getName()); } } class WelcomTask implements Runnable{ //在run方法中实现处理线程任务的逻辑 public void run() { System.out.printf("Welocm1!Im !%s.%n",Thread.currentThread().getName()); } }
2.定义Thread类的子类方式创建线程
public class WelcomApp { public static void main(String[] args) { //创建线程 Thread welcomThread = new WelcomThread(); //启动线程 welcomThread.start(); System.out.printf("welcom2! Im %s.%n",Thread.currentThread().getName()); } } //定义Thread类的子类class WelcomThread extends Thread{ //在run()方法中实现业务逻辑 public void run(){ System.out.printf("Welocm1!Im !%s.%n",Thread.currentThread().getName()); } }
线程两种创建方式的区别: (1)从面向对象编程的角度来看,创建Thread类的子类是一种基于继承的技术,第一种实现Runnable接口(以实现Runnable接口 实例为构造器参数直接通过new创建Thread实例)是一种基于组合(Composition)的技术。由于组合相对于继承来说,其类与类之间的耦合性(Couping)更低,因此,它也更加的灵活,即,优先使用组合。
(2)从对象共享的角度来看:第一种创建方式以意味着多个线程实例可以共享同一个Runnable实例。
(3)从对象创建成本来看:JAVA中的线程实例是一个“特殊”Runnable实例,因为在创建它的时候JAVA虚拟机会为其分配调用栈空间、内核线程等资源。因此,创建一个线程实例比起创建一个普通的Runnable实例来说,其成本要相对昂贵一点。所以,如果创建Runnable实例在将其作为方法参数传递给其他对象使用而不必用它来创建相应的线程,既可以满足我们的计算需要,也不需要创建线程实例。
上一篇:
IDEA上Java项目控制台中文乱码