一:创建线程的几种方式
1.第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法,然后在run方法里填写相应的逻辑代码。
class ThreadDemo1 extends Thread{
@Override
public void run() {
for(int i =0;i<5;i++){
System.out.println("Hello Thread"+i);
}
}
}
public class CreateThreadDemo {
public static void main(String[] args) {
ThreadDemo1 threadDemo1 = new ThreadDemo1();
threadDemo1.start();
}
}
2.第二种方法是实现Runnable接口,并编写run方法,相比继承Thread类创建线程的好处是以实现接口的方式创建线程可以对类进行更好的扩展,该类可以继承其他类来扩展自身需求,相比第一种方式更加灵活,扩展性强。
class ThreadDemo implements Runnable{
@Override
public void run() {
for(int i =0;i<5;i++){
System.out.println("Hello Thread"+i);
}
}
}
public class CreateThreadDemo {
public static void main(String[] args) {
Thread threadDemo1 = new Thread(new ThreadDemo());
threadDemo1.start();
}
}
3.实现Callable接口创建线程与Runnable接口的不同之处在于:如果你想要在线程执行完毕之后得到带有返回值的线程则实现Callable接口。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class ThreadDemo implements Callable<String>{
@Override
public String call() throws Exception {
return "Hello Callable";
}
}
public class CreateThreadDemo {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//利用线程池的方式创建线程
ExecutorService exec = Executors.newCachedThreadPool();
Future<String> submit = exec.submit(new ThreadDemo());
//获得线程返回值
String string = submit.get();
System.out.println(string);
}
}