一。继承Thread类创建子类
步骤:
1.定义Thread的子类,重写该类的run方法,run方法称为是执行体
2.创建Thread子类的实例,创建线程对象
3.调用线程对象的start()方法启动该线程
代码实现:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行");
}
}
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyThread().start();
}
}
也可以:
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("线程开启");
}
}).start();
}
}
二。实现Runnable接口创建线程
1.定义Runnable接口的实现类,重写run方法,是线程的执行体
2.创建Runnable实现类的实例,用这个实例作为Thread的target来创建Thread对象,这个Thread对象是真正的线程对象
3.调用线程对象的start()方法启动线程
class MyThread implements Runnable{
@Override
public void run(){
System.out.println("线程执行");
}
}
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread myThread =new MyThread();
Thread thread = new Thread(myThread);
thread.start();
//或者
// new Thread(new MyThread()).start();
}
}
三。使用Callable和Future创建线程
Callable接口提供一个call()方法作为线程执行体,call()方法比run()方法功能要强大,call()方法可以有返回值,call()方法可以声明抛出异常。
步骤:
1.创建Callable接口的实现类,实现call()方法,然后创建该实现类的实例
2.使用FutureTask类来包装Callable对象,该FutureTask对象封装Callable对象的call()方法的返回值
3.使用FutureTask对象作为Thread对象创建并启动线程
4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
int i = 0;
String reString = "";
for (; i < 10; i++) {
reString = Thread.currentThread().getName() + " " + i;
System.out.println(reString);
}
return reString;
}
}
public class A {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread myThread = new MyThread();
FutureTask<String> ft = new FutureTask<>(myThread);
new Thread(ft, "子线程").start();
}
}
1、接口实现更灵活,还可以继承其他类,java不支持多继承。在这方面,Runnable和Callable更有优势。
2、返回值问题。Runnable和Thread都不能有返回值,但Callable可以,而且支持多种类型的数据。
3、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。
4、使用callable和Future 和实现Runnable方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。