一、继承Thread类
- 步骤
1.自定义线程类,该类继承Thread,可重写run()方法
2.创建自定义线程类对象
3.该对象调用start()方法 - 举例
class MyThread extends Thread{
@Override
public void run() {
System.out.println("继承Thread类的自定义线程执行");
}
}
public class testCreateThread {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
二、实现Runnable接口
- 步骤
1.自定义Runnable类,该类实现Runnable,重写run()方法
2.创建自定义Runnable实例
3.将该实例作为参数创建Thread类对象(事实上,前3步可以用lambda表达式创建匿名内部类简写)
4.该对象调用start()方法 - 举例
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口的自定义线程执行");
}
}
public class testCreateThread {
public static void main(String[] args) {
Thread myRunnable1 = new Thread(new MyRunnable());
Thread myRunnable2=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现Runnable接口的自定义线程执行");
}
});
myRunnable1.start();
myRunnable2.start();
}
}
三、实现Callable接口
- 步骤
/*
1.自定义Callable类,该类实现Callable,重写call()方法
2.创建自定义Callable类实例
3.将该实例作为参数创建FutureTask类对象
4.将FutureTask类对象作为参数创建Thread类对象
5.Thread类对象调用start()方法
注:实现Callable接口和实现Runnable接口的区别是:实现Callable接口时重写的call()方法有返回值,可以通过FutureTask.get()来得到返回值;实现Runnable接口时重写的run()方法无返回值(当然也可以实现Runnable接口的同时也有返回值,具体看举例)
*/ - FutureTask
public class FutureTask<V>extends Object implements RunnableFuture<V>
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("实现Callable接口的自定义线程执行");
return "success1";
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口的自定义线程执行");
}
}
public class testCreateThread {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask1 = new FutureTask<>(new MyCallable());
FutureTask<String> futureTask2 = new FutureTask<>(new MyRunnable(),"success2");
Thread thread1 = new Thread(futureTask1);
Thread thread2 = new Thread(futureTask2);
thread1.start();
thread2.start();
System.out.println(futureTask1.get());
System.out.println(futureTask2.get());
}
}
四、Exectors工具类
- 步骤
1.调用Executors的静态方法创建线程池对象ExecutorService(ThreadPoolExecutor实现了ExecutorService接口)
2.调用线程池对象的execute()方法执行线程(每调用一次该方法,执行一次)
3.调用线程池对象的shutdown()方法关闭线程 - 举例
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"运行");
}
}
public class testCreateThread {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i <3 ; i++) {
executorService.execute(new MyRunnable());
}
executorService.shutdown();
}