多线程(1)

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();
    }
}

执行结果:线程池中的调用产生的线程分别执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值