一、概述
在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系:
线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
由上描述,可以得知线程作为cpu的基本调度单位,只有把多线程用好,才能充分利用cpu的多核资源。
本文基于JDK 8(也可以叫JDK 1.8)。
二、线程使用
2.1 启动线程
创建线程有四种方式:
- 实现Runnable接口
- 继承Thread类
- 使用JDK 8 的Lambda
- 使用Callable和Future
2.1.1 Runnable创建方式
public class MyThread implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }Thread thread = new Thread(new MyThread()); thread.start();2.1.2 继承Thread创建方式
public class MyThread extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } }MyThread thread = new MyThread(); thread.start();以上代码有更简单的写法,如下:
Thread thread = new Thread(){ @Override public void run() { System.out.println(Thread.currentThread().getName()); } }; thread.start();2.1.3 Lambda创建方式
new Thread(()-> System.out.println(Thread.currentThread().getName())).start();2.1.4 使用Callable和Future
看源码可以知道Thread的父类是Runnable是JDK1.0提供的,而Callable和Runnable类似,是JDK1.5提供的,弥补了调用线程没有返回值的情况,可以看做是Runnable的一个补充,下面看看Callable的实现。
public class MyThread implements Callable<String> { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName()); return Thread.currentThread().getName(); } }Callable<String> callable = new MyThread(); FutureTask<String> ft = new FutureTask<>(callable); new Thread(ft,"threadName").start(); System.out.println(ft.get());