一、Thread创建线程,通过新建类继承Thread类,重写run方法,然后在main方法中start(),创建并启动线程.
public class MyThread extends Thread{//除了构造方法和私有属性其他的都可以被继承下来 @Override//重写了父类Thread的run方法.//在main方法start()创建并启动线程时,会调用此方法. public void run(){ System.out.println("子线程的信息:"+Thread.currentThread().toString());} public MyThread(String name){ super(name); }}
<!-- wp:code -->
<pre class="wp-block-code"><code>public class Test{ public statci void main(String[] args){ MyThread mt = new MyThread("子线程"); mt.start();//创建并启动线程,并调用MyThread中重写过后的run方法 }}</code></pre>
<!-- /wp:code -->
二、通过实现Runnable接口来创建线程
public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0; i < 20; i++) { System.out.println(Thread.currentThread().getName()+" "+i); } }}
public class ThreadTest{ public static void main(String[] args){ MyRunnable mr = new MyRunnable(); Thread t = new Thread(mr,"测试线程"); t.start(); }}
通过Thread.currentThread().getName()可以查询线程的名称.
三、匿名内部类创建线程
public class AnonymousInnerClassThread { public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("Thread: "+i); } } }; new Thread(r).start(); for (int i = 0; i < 20; i++) { System.out.println("Thread II: "+i); } }}
通过创建一个匿名内部类来启动线程。匿名内部类,匿的是类的名字。通过一个匿名的类来implements接口重写其中的run方法。Thread中的构造方法有一个Thread(Runnable target).此时的r就相当于一个匿名类实现的target对象.
Thread和Runnable的区别
A:避免了Java单继承的局限性;
说明:如果使用方式一,那么在Java中一个类只能有一个直接父类,如果一个类已经继承其他的父类,那么当前这
个类中假如有需要多线程操作的代码,这时这个类是无法再继承Thread类的。这样就会导致当前这个类中的某些
需要多线程执行的任务代码就无法被线程去执行。
B:把线程代码和任务的代码分离,解耦合(解除线程代码和任务的代码模块之间的依赖关系)。代码的扩展性非常
好;
说明:Thread类是专门负责描述线程本身的。Thread类可以对线程进行各种各样的操作。如果使用第一种方式,
那么把线程要执行的任务也交给了Thread类。这样就会导致操作线程本身的功能和线程要执行的任务功能严重的
耦合在一起。
但是方式二,自定义一个类来实现Runnable接口,这样就把任务抽取到Runnable接口中,在这个接口中定义线程
需要执行的任务的规则。当需要明确线程的任务时,我们就让这个类实现Runnable接口,只要实现Runnable接口
的类,就相当于明确了线程需要执行的任务。
当一个类实现Runnable接口,就相当于有了线程的任务,可是还没有线程本身这个对象。这时我们就可以直接使
用Thread这个类创建出线程,然后把任务交给线程。这样就达到任务和线程的分离以及结合。
