创建线程的方法
使用一个类继承Thread类,之后通过该类重写run方法,可以直接通过创建该类对象的start方法创建线程。
通过实现Runnable接口创建线程类。创建线程时
new Thread(实现接口的类实例,"创建线程的名称").start();
对比两种方法,其中最大的差别就是通过实现Runnable接口的方法创建的线程资源是共享的,因为实现接口的类将成为线程的target。而直接创建新类继承Thread的话,线程之间不会共享资源。
还有一种通过实现Callable接口的方法,该方法与Runnable的不同就是该方法有返回值并且可以抛出异常。
通过实现Callable接口创建进程
//在<>中添加Callable的返回类型
public class test implements Callable<Integer>{
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int i=0;
for(;i<20;i++){
System.out.println(Thread.currentThread().getName()+i);
}
//返回值
return i;
}
public static void main(String[] args) {
test a=new test();//创建实现接口类的实例
FutureTask<Integer> task=new FutureTask<>(a);//通过FutureTast完成一个类似于包装的效果
new Thread(task,"通过Callable实现的线程").start();//这里的Thread实际上还是以Callable作为target的
//之后线程启动执行call方法中的内容
System.out.println("返回的值"+task.get());//通过get方法得到返回值。
}
}
由上面例子得出通过实现Runnable接口和Callable接口的实现方法基本一样。在实现多线程合作时优先选择Runnable和Callable