创建线程的三种方式:继承Thread类、实现Runnable接口、实现Callable接口
继承Thread类:
public class Test {
public static void main(String[] args) {
TestThread testThread01 = new TestThread("testThread01");
TestThread testThread02 = new TestThread("testThread02");
TestThread testThread03 = new TestThread("testThread03");
testThread01.start();
testThread02.start();
testThread03.start();
}
}
class TestThread extends Thread{
String currentThreadName;
public TestThread(String currentThreadName) {
this.currentThreadName = currentThreadName;
}
@Override
public void run() {
System.out.println("currentThread: " + currentThreadName);
}
}
实现Runnable接口:
public class Test {
public static void main(String[] args) {
TestThread testThread = new TestThread();
Thread thread01 = new Thread(testThread, "Thread01");
Thread thread02 = new Thread(testThread, "Thread02");
Thread thread03 = new Thread(testThread, "Thread03");
thread01.start();
thread02.start();
thread03.start();
}
}
class TestThread implements Runnable{
@Override
public void run() {
System.out.println("currentThread: " + Thread.currentThread().getName());
}
}
实现Callable接口
Callable的优势: 01.可以自定义返回值 02.可以抛出异常
public class Test {
public static void main(String[] args) {
TestThread testThread01 = new TestThread("testThread01");
TestThread testThread02 = new TestThread("testThread02");
TestThread testThread03 = new TestThread("testThread03");
//创建执行服务(线程池)
ExecutorService service = Executors.newFixedThreadPool(10);
//提交执行 并通过Future<Boolean>接收返回值
Future<Boolean> result01 = service.submit(testThread01);
Future<Boolean> result02 = service.submit(testThread02);
Future<Boolean> result03 = service.submit(testThread03);
//获取返回值
try {
boolean getReturn01 = result01.get();
boolean getReturn02 = result02.get();
boolean getReturn03 = result03.get();
//输出返回值
System.out.println(getReturn01);
System.out.println(getReturn02);
System.out.println(getReturn03);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
//关闭服务
service.shutdown();
}
}
}
class TestThread implements Callable<Boolean> {
String currentThreadName;
public TestThread(String currentThreadName) {
this.currentThreadName = currentThreadName;
}
@Override
public Boolean call() throws Exception {
System.out.println(currentThreadName);
return true;
}
}