1、继承Thread类
步骤:a、定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程需要完成的任务。
b、创建Thread子类的实例,即创建了线程对象。
c、调用线程对象的start()方法来启动该线程。
//通过继承Tread类来创建线程 public ThreadTest1 extends Thread{ //重写run()方法 public void run(){ System.out.println("我是一个线程。"); } public static void main(String[] args){ //创建TreadTest1类的实例 ThreadTest1 t = new ThreadTest1(); //启动线程 t1.start(); } }
注:该方法创建的线程,多个线程之间无法共享线程类的实例变量。
2、实现Runnable接口
步骤:a、定义Runnable接口的实现类,并重写该接口的run()方法。
b、创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
c、调用线程对象的start()方法来启动该线程。
//通过实现Runnable接口来创建线程 public class ThreadTest2 implements Runnable{ //重写run()方法 public void run(){ System.out.println("我是第二种创建线程的方法"); } public static void main(String[] args){ ThreadTest2 t2 = new ThreadTest2(); new Thread(t2,"新线程").start(); } }
注:该方法创建的多个线程可共享线程类的实例变量。
3、实现Callable接口(java 5开始提供)
步骤:a、创建Callable接口的实现类实例,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的实例。
b、使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
c、使用FutureTask对象作为Thread对象的target创建并启动新线程。
d、调用FutureTask对象的get()方法来获得子线程执行后的返回值。