1.继承Thread类
2.实现Runnable接口
区别:
采用继承Thread类:
(1)代码简单,直接通过Thread的构造方法创建线程,且访问当前线程时,直接调用this.即可获得当前线程。
(2)因为已经继承Thread类,所以不能继承其他父类。
(3)若要两个线程之间共享变量时,需要在声明为static变量。
采用实现Runnable接口:
(1)线程只是实现了Runnable接口,还可以继承其他类和实现其他接口;
(2)可以多个线程之间共享同一个目标对象,非常适合多个线程处理同一份资源的情况;
(3)代码稍微复杂一些,若要访问当前线程,必须使用Thread.currentThread()方法。
当没有声明static变量时:
Runnable可以实现资源共享但是Thread不能,原因:
1.因为一个线程只能启动一次,通过Thread实现线程时,线程和线程所要执行的任务是捆绑在一起的。也就使得一个任务只能 启动一个线程,不同的线程执行的任务是不相同的,所以没有必要,也不能让两个线程共享彼此任务中的资源。
2.一个任务可以启动多个线程,通过Runnable方式实现的线程,实际是开辟一个线程,将任务传递进去,由此线程执行。可以 实例化多个 Thread对象,将同一任务传递进去,也就是一个任务可以启动多个线程来执行它。这些线程执行的是同一个任 务,所以他们的资源是共享。