创建线程
线程的创建有以下3种方式:
继承Thread类 ①定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 ②创建Thread子类的实例,即创建了线程对象。 ③调用线程对象的start()方法来启动该线程。
实现Runnable接口 ①定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。 ②创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。 ③调用线程对象的start()方法来启动该线程。
实现Callable接口(jdk1.5新增,在java.util.concurrent包) ①创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。 ②创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。 ③使用FutureTask对象作为Thread对象的target创建并启动新线程。 ④调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
示例
public class ThreadLearning {
//------------------------继承Thread类-----------------------
//匿名内部类的形式
@org.junit.Test
public void generateThread_1() {
Thread thread = new Thread() {
@Override
public void run() {
//do something
System.out.println("1");
}
};
thread.start();
}
//正常形式
@org.junit.Test
public void generateThread_2() {
Thread1 thread1 = new Thread1();
thread1.start();
}
class Thread1 extends Thread{
@Override
public void run() {
//do something
System.out.println("2");
}
}
//------------------------实现Runnable接口-----------------------
//匿名内部类的形式
@org.junit.Test
public void generateThread_3() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//do something
System.out.println("1");
}
});
thread.start();
}
//正常形式
@org.junit.Test
public void generateThread_4() {
Thread2 thread2 = new Thread2();
Thread thread = new Thread(thread2);
thread.start();
}
class Thread2 implements Runnable{
@Override
public void run() {
//do something
System.out.println("2");
}
}
//------------------------实现Callable接口-----------------------
@org.junit.Test
public void generateThread_5() {
Thread3 thread3 = new Thread3();
FutureTask<String> futureTask = new FutureTask<String>(thread3);
new Thread(futureTask).start();
try {
String s = futureTask.get();
System.out.println(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
class Thread3 implements Callable<String>{
@Override
public String call() throws Exception {
return "我是实现Callable接口的线程类";
}
}
}
Last updated