一、java线程创建的三种方式?
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
代码如下:
class MyThreadDemo extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("thread start...");
}
}
class MyRunnableDemo implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("thread start...");
}
}
// 泛型中的类型为call返回的类型;这种实现方式可以有返回值;
class MyCallableDemo implements Callable<String>{
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("thread start...");
return "thread stop";
}
}
// 测试代码
public class ThreadTest{
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 测试继承Thread;
MyThreadDemo threadDemo = new MyThreadDemo();
threadDemo.start();
// 测试实现Runnable接口;
MyRunnableDemo myRunnableDemo = new MyRunnableDemo();
new Thread(myRunnableDemo).start();
// 测试实现Callable接口;
MyCallableDemo myCallableDemo = new MyCallableDemo();
// 使用FutureTask来包装Callable对象;
FutureTask<String> task = new FutureTask<String>(myCallableDemo);
new Thread(task).start();
try {
// get()方法会等待线程执行结束;
System.out.println(task.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三种创建方式的对比:
采用两种实现接口的方式创建线程
优点 1、实现接口同时还可以继承其他类;2、多个线程可以共享同一个target对象,所以非常适合多个相同的线程来处理同一份资源的情况。
推荐:一般推荐采用实现接口的方式来创建线程。