四种方法包括:实现Runnable接口实现run ()方法、继承Thread类重写run()方法、实现Callable接口实现call()方法、由线程池通过submit() | execute() 方法创建
Java创建线程的四种方法
1. 实现Runnable
接口
创建一个类实现Runnable
接口,实现run()
方法
| public class MyThread1 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }
|
实例化一个该类的对象传入Thread()
构造方法,通过创建的thread对象调用start()
方法就开启了该线程
1 2 3 4
| public static void main(String[] args) throws ExecutionException, InterruptedException { Thread thread1 = new Thread(new MyThread1()); thread1.start(); }
|
2. 继承Thread
类
创建一个类继承Thread
类,重写run()
方法
1 2 3 4 5 6
| public class MyThread2 extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }
|
实例化一个该类的对象传入Thread()
构造方法,通过创建的thread对象调用start()
方法就开启了该线程
1 2 3 4
| public static void main(String[] args) throws ExecutionException, InterruptedException { Thread thread2 = new Thread(new MyThread2()); thread2.start(); }
|
3.实现 Callable
接口
创建一个类实现Callable
接口,实现call()
方法
call()
方法是有返回值的,所以这种方法用来创建有返回值的线程
1 2 3 4 5 6 7
| public class MyThread3 implements Callable { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()); return "Hello World"; } }
|
实例化一个该类的对象传入FutureTask<>()
构造方法,创建一个FutureTask<>
类型的对象,将该对象传入Thread()
构造方法,调用start()
方法就开启了该线程(泛型是返回值的类型)
通过上面创建的FutureTask<>
类型的对象调用get()
方法可以拿到call()
的返回值
1 2 3 4 5 6 7
| public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<String>(new MyThread3()); Thread thread3 = new Thread(futureTask); thread3.start(); String s = futureTask.get(); System.out.println(s); }
|
4.线程池
线程池的工作流程:
当新的任务来到线程池
- 如果此时线程池中线程数少于
corePoolSize
,就会创建新的核心线程执行该任务,即使有空闲的核心线程
- 如果此时线程池中线程数等于
corePoolSize
,并且没有空闲核心线程,新的任务就会加入任务队列等待(如果有空闲核心线程就会让空闲核心线程执行吗?)
- 如果任务队列已满,但是线程数还没有达到
maximumPoolSize
,就会创建新的临时线程来执行该任务
- 如果线程数量已达最大线程数,并且任务队列已满,新的任务就会被拒绝,并由
RejectedExecutionHandler
处理
一个任务被执行完成后,就会从任务队列中拉取下一个任务来执行,核心线程会永久存活,临时线程空闲超过存活时间就会被释放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 100, 200, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100) ); threadPoolExecutor.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); Future<String> submit = threadPoolExecutor.submit(new Callable<String>() { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()); return "HelloWorld"; } }); String s = submit.get(); System.out.println(s); }
|