- 继承Thread类
public class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
public static void main(String [] args ){
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
myThread1.start();
myThread2.start();
}
- 实现Runable接口
public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread); //实例化Thread传入Runable target
thread.start();
}
}
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
public void run() {
if (target != null) {
target.run();
}
}
实现Runnable接口相对于扩展Thread类来说,具有很大的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。
后面两种情况不常用:
3. 实现Callable接口通过FutureTask包装器来创建Thread线程。
实现Callable接口,新建当前类对象,再新建FutureTask类对象时传入当前类对象,接着新建Thread类对象时传入FutureTask类对象,最后运行Thread对象的start()方法新建当前类对象。
4.使用ExecutorService、Callable、Future实现有返回结果的多线程。