20240724
Runnable接口
定义:
是Java中的一个接口,用于表示可以通过线程执行的任务。它定义了一个单一的抽象方法 run(),该方法在实现了该接口的类中被重写,用来包含任务的具体逻辑。通过实现Runnable接口,可以将任务与线程执行分离,使得代码更加清晰和灵活。
主要优点:
解耦任务和线程: 通过将任务逻辑封装在Runnable的实现类中,可以轻松地将同一个任务分配给多个线程执行,或者将不同的任务分配给同一个线程执行。
继承灵活性: Java的类是单继承多实现的,如果一个类已经继承了其他类,就无法再继承Thread类来创建新的线程。而实现Runnable接口允许类继续扩展其他类。
适合资源共享: 当多个线程需要共享同一份资源时,通过实现Runnable接口并将资源传递给它的实例,可以更容易地实现资源共享,避免资源竞争和数据不一致性问题。
以下是一个简单的示例,演示了如何使用Runnable接口创建并启动一个线程:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread running...");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
在这个示例中,MyRunnable实现了Runnable接口,并重写了run方法,在main方法中创建了一个Thread对象,将MyRunnable实例传递给它,然后启动线程。
使用Runnable接口是Java多线程编程中的一种常见方式,它提供了一种更加灵活和可控的方式来处理并发任务。
Executors 类是用于创建和管理线程池的工厂类,它提供了一些静态方法来创建不同类型的线程池。线程池是一种管理线程的方式,通过复用线程并限制线程的数量,可以有效地提高程序的性能和资源利用率,尤其在需要处理大量异步任务或并发请求时特别有用。
主要的静态方法和用法:
newFixedThreadPool(int nThreads):
创建一个固定大小的线程池,该池中的线程数量始终为指定的数量 nThreads。如果任务数量大于线程数量,任务会被放入队列等待执行。
示例:
java
ExecutorService executor = Executors.newFixedThreadPool(5);
newCachedThreadPool():
创建一个可缓存的线程池,线程池的线程数量不固定,可根据需求自动扩展,如果线程空闲超过60秒将自动回收。适合执行大量的短期异步任务。
示例:
java
ExecutorService executor = Executors.newCachedThreadPool();
newSingleThreadExecutor():
创建一个单线程化的线程池,内部只有一个工作线程来执行任务,保证所有任务按照指定顺序(FIFO)执行。
示例:
ExecutorService executor = Executors.newSingleThreadExecutor();
newScheduledThreadPool(int corePoolSize):
创建一个固定大小的线程池,可以执行延迟任务或定时任务。
示例:
java
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
newWorkStealingPool():
创建一个工作窃取线程池,每个线程都维护自己的任务队列,如果某个线程完成了自己的任务队列,它可以从其他线程的队列中窃取任务来执行。
示例:
ExecutorService executor = Executors.newWorkStealingPool();
适用场景和优点:
简化线程管理: Executors类封装了线程池的创建和管理过程,简化了线程池的使用。
提高性能: 使用线程池可以减少线程创建和销毁的开销,提高系统的性能和响应速度。
控制并发度: 可以通过选择不同类型的线程池来控制并发任务的执行方式,例如固定大小的线程池用于有限的资源控制,缓存线程池用于大量短期任务等。
总之,Executors 类提供了一种方便且强大的方式来管理和控制线程池,是多线程编程中常用的工具之一,可以帮助开发者轻松地实现高效的并发程序。
常用:
1、创建具有单个线程的线程池
newSingleThreadExecutor()方法
ExecutorService threadPool=
Executors.newSingleThreadExecutor();
完整代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test1 {
public static void main(String[] args) {
Runnable task=new MyThread();
ExecutorService threadPool=
Executors.newSingleThreadExecutor();
for (int i = 1; i <=12 ; i++) {
threadPool.execute(task);
}
threadPool.shutdown();
}
}
2、多个线程的线程池执行任务
newFixedThreadPool(5)方法
ExecutorService threadPool=
Executors.newFixedThreadPool(5);
代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test1 {
public static void main(String[] args) {
Runnable task=new MyThread();
ExecutorService threadPool=
Executors.newFixedThreadPool(5);
for (int i = 1; i <=12 ; i++) {
threadPool.execute(task);
}
threadPool.shutdown();
}
}
执行结果:线程池中的调用产生的线程分别执行