一、通过继承Thread类并且重写run方法
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Hello Thread!");
}
}
随后创建Thread对象并且使用start方法来开启线程:
MyThread myThread1 = new MyThread(); // 创建线程
myThread1.start(); // 开启线程
这里说一下start()方法和run()的区别,run()方法其实只是调用的myThread的run()方法,并没有创建多线程,而start()方法才是创建了一个线程去单独运行run()方法。
二、实现Runnable的run方法
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Hello Runnable!");
}
}
这里和第一个方法相似,只是需要把Runnable当成参数传入Thread:
Thread myThread2 = new Thread(new MyRunnable()); // 创建线程
myThread2.start(); // 开启线程
三、实现Callabled的call方法
class MyCallable<T> implements Callable<T> {
@Override
public T call() throws Exception {
System.out.println("Hello Callable");
return null; // 返回结果
}
}
这个方法较为麻烦,但是该方法主要是为了获取线程返回值,其中的类型T既是返回值类型,需要使用get()方法来获取返回值。但是需要注意的是该方法会阻塞当前线程,除非被获取返回值的线程以及运行完毕:
FutureTask<String> ft = new FutureTask<>(new MyCallable<String>()); // 创建FutureTask对象
Thread myThread3 = new Thread(ft); // 创建线程
myThread3.start(); // 开启线程
String value = ft.get(); //获取线程返回值