一般有三种方法
1、通过继承Thread类来创建。
首先重写该类的run方法(线程执行体),创建Thread子类的实例,即线程对象,调用start()方法启动线程,如果没有start的话不会启动多个线程。常用方法:Thread.currentThread()和getName()(两者一起或者只用后者都可以),当然也可以自己通过setName(String name)来设置线程的启动名字
2、实现Runnable接口
首先同样是重写run方法,创建Runnable实现类的实例(假如是st),并以此实例作为Thread的target来创建Thread对象(new(st)或者new(st,“线程自定义名字”)),该Thread才是真正的线程对象。最后调用start方法启动(new Thread(st).start());(只能用Thread.currentThread.getName()不能直接用getName());不要忘了线程的数量应包括main方法所在的主线程。
总结:继承Thread类的方法创建线程类的时候,多个线程不能共享线程类的实例变量,而实现Runnable接口可以,因为其只是作为target传入Thread,多个线程共享一个target,那么线程的实例属性的变化是连续的。(验证的时候注意,这里说的线程不包括主线程执行的结果是连续的,只是start启动的线程的实例变量变化连续(不是局部变量))
3、通过实现Callable接口和Future来创建线程
步骤:A、创建Callable接口的实现类,并实现call()方法(跟run方法作用一样,只不过call方法可以有返回值和抛出异常)
B、创建实现Callable的类的实例,使用FutureTask来包装Callable对象(),FutureTask也就封装了call()方法的返回值
C、使用FutureTask对象作为Thread对象的target来创建并启动线程
D、使用FutureTask对象的get()方法可以获得子线程结束后的返回值。
public test implements Callable<Integer>
. .public Integer call(){
. .int i=0;
. .for(;i<100;i++){
. . System.out.println(Thread.currentThread().getName()+“的i值是”+i);
. .}
return i;
. .
. .}public static void main(String[]args){
. . test rt=new test();
. .FutureTask<Integer> task=new FutureTask<Integer>(rt);
. .for(int i=0;i<100;i++){
. .Syste....println(Thread.currentThread.getName());
. .if(i==20) new Thread(task,"有返回值的线程").start();
. .try{System...println("子线程返回值是"+task.get())}catch(Exception e){e.print...};
. .
. .}
. .}
}