1.继承Thread类创建线程 此方法的缺点是Java是单继承,继承Thread类后无法继承别的类
public class ThreadDemo extends Thread{
private List list;
public ThreadDemo(List a) {
this.list=a;
}
public void run() {
System.out.println("ThreadDemo");
}
}
2.实现Runnable创建线程
public class RunnableDemo implements Runnable{
private List list;
public RunnableDemo(List a) {
this.list=a;
}
@Override
public void run() {
System.out.println("RunnableDemo");
}
}
或者
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
},"r1").start();
}
3.通过Callble 和future Task创建线程
public class MyCallableDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<Double> task = new FutureTask(new MyCallable());
//创建一个线程,异步计算结果
Thread thread = new Thread(task);
thread.start();
//主线程继续工作
Thread.sleep(1000);
System.out.println("主线程等待计算结果...");
//当需要用到异步计算的结果时,阻塞获取这个结果
Double d = task.get();
System.out.println("计算结果是:"+d);
//用同一个 FutureTask 再起一个线程
Thread thread2 = new Thread(task);
thread2.start();
}
}
class MyCallable implements Callable<Double>{
public Double call() {
double d = 0;
try {
System.out.println("异步计算开始.......");
d = Math.random()*10;
d += 1000;
Thread.sleep(2000);
System.out.println("异步计算结束.......");
} catch (InterruptedException e) {
e.printStackTrace();
}
return d;
}
}