Java并发(6):创建线程、线程池

1 创建线程方式

public interfact Runnable{
void run();
}

1.1 实现runnable接口

创建一个类实现Runnable接口,实现run方法,然后创建Thread类的实例,将实现了Runnable接口的对象作为参数传递给Thread的构造方法,并调用start方法启动线程。

  1. 将任务代码移到实现了Runnable接口的类的run方法中(由于Runnable 是一个函数式接口,可以用lambda 表达式建立一个实例)

  2. Runnable创建一个Thread对象

  3. 启动线程

public class demo1 {
public static void main(String[] args){
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("任务开始");
}
};
Thread t1=new Thread(r1);
t1.start();

Runnable r2=()->{
System.out.println("lambda表达式:任务开始");
};
Thread t2=new Thread(r2);
t2.start();


Thread t3=new Thread(()->{
System.out.println("在thread中lambda表达式");
});
t3.start();
}
}

1.2 继承Thread类

创建一个类继承自Thread类,并重写run方法,然后创建该类的实例并调用start方法启动线程。

class Thread implements Runnable{

}
public class MyThread extends Thread{
public void run(){
System.out.println("继承Thread类,重写run方法");
}
public static void main(String[] args){
MyThread myThread=new MyThread();
myThread.start();
}
}

1.3 实现Callable接口

public interface Callable<V>{
V call() throws Exception;
}
  • 继承Callable实现call方法

  • FutureTask包装器将Callable转换成Future和Runnable

public class CallableDemo implements Callable<String> {

@Override
public String call() throws Exception {
return "Hello World";
}

public static void main(String[] args) throws Exception {
CallableDemo callableDemo = new CallableDemo();
FutureTask<String> futureTask = new FutureTask<>(callableDemo);
Thread t=new Thread(futureTask);
t.start();
System.out.println(futureTask.get());
}
}

2 线程池

2.1 newCachedThreadPool

创建一个可缓存的线程池,线程池的大小可根据需要进行自动扩展,但在某些情况下可能会回收线程。

ExecutorService executor = Executors.newCachedThreadPool();

2.2 newFixedThreadPool

创建一个固定大小的线程池,线程数始终保持不变。

2.3 newSingleThreadExecutor

  • 创建一个单线程的线程池,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。

2.4 newScheduledThreadPool

  • 创建一个定时执行任务的线程池。