首先要明白什么是线程和进程。
- 进程是什么呢? 进程是计算机中运行的一个应用程序.
- 线程:执行该进程的逻辑单元. 线程是用来执行进程的.
创建线程的四种方式:
继承Thread类,并复写run方法,创建该类对象,调用start方法开启线程。此方式没有返回值。
实现Runnable接口,复写run方法,创建Thread类对象,将Runnable子类对象传递给Thread类对象。调用start方法开启线程。此方法2较之方法1好,将线程对象和线程任务对象分离开。降低了耦合性,利于维护。此方式没有返回值。
创建FutureTask对象,创建Callable子类对象,复写call(相当于run)方法,将其传递给FutureTask对象(相当于一个Runnable)。 创建Thread类对象,将FutureTask对象传递给Thread对象。调用start方法开启线程。这种方式可以获得线程执行完之后的返回值。该方法使用Runnable功能更加强大的一个子类.这个子类是具有返回值类型的任务方法。
线程池
- 提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。
- 线程池的体系结构:
java.util.concurrent.Executor : 负责线程的使用与调度的根接口
|--**ExecutorService 子接口: 线程池的主要接口
|--ThreadPoolExecutor 线程池的实现类
|--ScheduledExecutorService 子接口:负责线程的调度
|--ScheduledThreadPoolExecutor :继承 ThreadPoolExecutor, 实现 ScheduledExecutorService - 工具类 : Executors
a) ExecutorService newFixedThreadPool() : 创建固定大小的线程池
b) ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
c) ExecutorService newSingleThreadExecutor() : 创建单个线程池。线程池中只有一个线程
d) ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,`与ExecutorService 的区别是还可以延迟或定时的执行任务*。
示例代码:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class NewThreadDemo {
public static void main(String[] args) throws Exception {
//第一种方式
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("第1种方式:new Thread 1");
}
};
t1.start();
TimeUnit.SECONDS.sleep(1);
//第二种方式
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("第2种方式:new Thread 2");
}
});
t2.start();
TimeUnit.SECONDS.sleep(1);
//第三种方式
FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
String result = "第3种方式:new Thread 3";
return result;
}
});
Thread t3 = new Thread(ft);
t3.start();
// 线程执行完,才会执行get(),所以FutureTask也可以用于闭锁
String result = ft.get();
System.out.println(result);
TimeUnit.SECONDS.sleep(1);
//第四种方式
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<String> future = pool.submit(new Callable<String>(){
@Override
public String call() throws Exception {
String result = "第4种方式:new Thread 4";
return result;
}
});
pool.shutdown();
System.out.println(future.get());
}
}