线程
- 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程资源。
- 操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特使,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。
线程创建的三种方式
继承Thread类
- 继承Thread类
- 重写run方法
代码如下:
public class MyThread extends Thread {
@Override
public void run(){
// 方法体
}
}
启动线程:
@Test
public void testStart(){
Thread thread=new MyThread();
thread.start();
}
实现Runnable接口
- 实现Runnable接口
- 重写run方法
代码如下:
public class RunnableTask implements Runnable {
@Override
public void run() {
// 方法体
}
}
启动线程:
@Test
public void testStart(){
RunnableTask rt=new RunnableTask();
new Thread(rt).start();
new Thread(rt).start();
}
与第一种方法相比,实现了任务与代码分离,不同线程可以共用同一个任务。
实现Callable接口
- 实现Callable接口
- 重写call()方法
代码如下:
public class CallerTask implements Callable<String> {
@Override
public String call() throws Exception {
// 内容
return Thread.currentThread().toString();
}
}
启动线程:
@Test
public void testStart(){
// 创建FutureTask对象
FutureTask<String> futureTask=new FutureTask<>(new CallerTask());
// 启动线程
new Thread(futureTask).start();
try {
//获取线程返回值
String result=futureTask.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
三种方式异同
获取当前线程 | 线程方法 | 启动方法 | 返回值 | |
---|---|---|---|---|
继承Thread | this | run() | start() | 无 |
实现Runnable接口 | Thread.currentThread() | run() | start() | 无 |
实现Callable接口 | Thread.currentThread() | call() | start() | 有 |
本文参考自《Java并发编程之美》翟陆续 薛宾田 著