将这段代码改造为实现使用线程池ExecutorService创建线程。实现并说明有什么不同。class TicketSeller extends Thread private static int ticketCount = 100; 总票数假设有100张票 Override public void run while tick
使用线程池ExecutorService创建线程可以通过以下步骤来改造代码:
- 创建一个实现Runnable接口的TicketSeller类,重写run()方法。
 - 在run()方法中使用while循环,条件为ticketCount大于0。
 - 在while循环内部,使用synchronized关键字来同步访问ticketCount。
 - 在synchronized块内部,判断ticketCount是否大于0,如果是则卖出一张票并打印相关信息,然后将ticketCount减1。
 - 在synchronized块外部,使用Thread.sleep()方法模拟卖票过程中的其他操作。
 - 在main()方法中,创建一个FixedThreadPool线程池,线程数为3。
 - 使用ExecutorService.submit()方法将TicketSeller实例提交给线程池执行。
 - 最后,调用ExecutorService.shutdown()方法关闭线程池。
 
改造后的代码如下:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
class TicketSeller implements Runnable { private static int ticketCount = 100; // 总票数,假设有100张票
@Override
public void run() {
    while (ticketCount > 0) {
        synchronized (TicketSeller.class) {
            if (ticketCount > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了第" + ticketCount + "张票");
                ticketCount--;
            }
        }
        try {
            Thread.sleep(100); // 模拟卖票过程中的一些其他操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public static void main(String[] args) {
    TicketSeller seller = new TicketSeller();
    ExecutorService executor = Executors.newFixedThreadPool(3);
    executor.submit(seller);
    executor.submit(seller);
    executor.submit(seller);
    executor.shutdown();
}
}
使用线程池ExecutorService创建线程的不同之处在于:
- 不再使用Thread类来创建线程,而是使用ExecutorService.submit()方法来提交任务给线程池执行。
 - 线程池会自动管理线程的创建和销毁,不需要手动创建和启动线程。
 - 线程池可以重用线程,减少线程创建和销毁的开销,提高性能。
 - 可以通过调整线程池的大小来控制并发线程的数量。
 - 使用ExecutorService.shutdown()方法来关闭线程池,确保所有任务执行完毕
 
原文地址: https://www.cveoy.top/t/topic/ir20 著作权归作者所有。请勿转载和采集!