这里面主要介绍了创建新线程的几个方法,不讨论实现线程有多少种的方法
实现 Runnable 接口
public class TestRunnableInterface implements Runnable{
@Override
public void run() {
System.out.println("我创建了一个新的线程!");
}
public static void main(String[] args) {
TestRunnableInterface runnable = new TestRunnableInterface();
Thread thread = new Thread(runnable);
thread.start();
}
}
实现 Runnable接口后,需要重写它的 run()方法,并在Runnable方法中实现自己的操作,具体实现什么,看自己的需求。后面我们需要创建一个线程,把我们实现Runnable接口的类给传入进去,然后调用 start()方法,方可运行
继承 Thread 类
public class TestThreadExtends extends Thread{
@Override
public void run() {
System.out.println("TestThreadExtends 执行了!");
}
public static void main(String[] args) {
TestThreadExtends testThreadExtends = new TestThreadExtends();
testThreadExtends.start();
}
}
继承 Thread方法后,跟上面的一样,需要重写 run(),并实现自己想要执行的操作。后面我们则不需要创建一个新的线程类来辅助创建线程执行了,只要使用继承 Thread的这个类,直接调用 start()方法,就可以使用了
匿名内部类创建一个新的线程
public class AnonymityThread{
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类好像也运行了!");
}
});
thread.start();
}
}
上面的匿名实现的方法,是不是看着挺容易实现的,而且还不用新创建一个类,是不是意味着好呢?其实这样不太易于重复使用同一个功能,如果你需要再使用,那么就得重新写同样的代码,需要使用的次数多,也就冗余的代码量会很多
其它能创建新线程的类,就不多赘述了,有 Callable创建新线程,有线程池创建新线程,具体方法很多
回到前面的代码,既然有几种简单实现线程的方法,那么实现 Runnable接口和继承 Thread类,哪个更好?
我见到过的有以下几点:
-
实现与运行分开,实现Runnable接口实现你需要的功能操作,新建Thread类来负责运行(仅运行),而不执行其它操作
-
每次需要重复执行,继承 Thread的类,都需要重新创建一个对象,来执行任务,如果数量够多,性能开销会比较大。如果实现的是 Runnable接口,那么只要把这个实现接口的类传入线程池,就可以减少大量的性能开销
-
扩展性,继承只能单继承,继承 Thread类的,后面就不能继承新的类了。而实现 Runnable接口的类,后面还可以继承别的类,扩展性相对好一些
欢迎大家关注下个人的「公众号」:独醉贪欢