总结
1、三种方式都需要new Thread(),只是传入thread类的参数不一样
2、callable方式允许线程有返回值
1、继承Thread类,重写run方法
package com.thread;
public class FirstThreadTest extends Thread{
int i = 0;
public void run()
{
for(;i<100;i++){
System.out.println(getName()+" "+i);
}
}
}
2、实现runnable接口,实现run方法,再传入Thread类
package com.thread;
public class RunnableThreadTest implements Runnable
{
private int i;
public void run()
{
for(i = 0;i <100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args)
{
RunnableThreadTest rtt = new RunnableThreadTest();
new Thread(rtt,"新线程1").start();
new Thread(rtt,"新线程2").start();
}
}
3、实现Callable接口,实现call()、传入FutureTask、再传入Thread
package com.demo;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableThreadTest implements Callable<Integer>
{
public static void main(String[] args)
{
CallableThreadTest ctt = new CallableThreadTest();
FutureTask<Integer> ft = new FutureTask<Integer>(ctt);
new Thread(ft,"有返回值的线程").start();
System.out.println("子线程的返回值:"+ft.get());
}
@Override
public Integer call() throws Exception
{
int i = 0;
for(;i<100;i++)
{
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
}