线程是操作系统的最小执行单元,每个线程都归属于一个进程,一个进程往往是一个独立的服务。
创建线程
创建线程的过程分两步:声明任务和启动线程。声明任务是定义线程需要执行的具体内容,启动线程是将任务托管到线程上交给操作系统去执行。
声明任务
声明任务的方式有三种,分别是:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
下面分别看一下这三种方式的使用:
- 继承Thread类
public static class ThreadTask extends Thread {
//覆盖run方法,在此处编写业务逻辑
@Override
public void run() {
System.out.println("Hello, I'am ThreadTask");
}
}
public static void main(String[] args) {
//创建线程实例
Thread thread = new ThreadTask();
//启动线程
thread.start();
}
这种方式虽然能够实现预期效果,但并不推荐通过继承Thread来定义一个线程,因为这样会把任务到语义耦合到线程上。
- 实现Runnable接口
public static class RunnableTask implements Runnable {
//覆盖run方法,在此处编写业务逻辑
@Override
public void run() {
System.out.println("Hello, I'am RunnableTask");
}
}
public static void main(String[] args) {
//声明任务
Runnable task = new RunnableTask();
//声明线程
Thread thread = new Thread(task);
thread.start();
}
与继承Thread相比,这种方式可以将要执行到业务逻辑和线程解耦合,线程只描述一个具体到执行单元,Runnable定义任务到具体内容。
- 实现Callable接口
Callable接口与Runnable接口具有相同的功能,区别在于Callable接口定义的任务可以获取其返回值,同时,提交Callable任务需要通过Java 5提高的线程调度框架ExecutorService,而不是用Thread.start()来启动线程。
public static