原先多线程并发编程的学习笔记和代码整理一下贴上来。
---------------------------------
线程创建与线程池
一、线程创建
创建一个线程的方式有2种,一种是直接重写Thread类的run方法,另一种是实现Runnable接口重写run方法,然后传入Thread构造函数的方式启动。
1、直接使用Thread方式:
class InnerThreadTask{ private Thread t; private String name; private int i=5;//每个线程执行5次 public InnerThreadTask(String name){ this.name=name; } public void runTask(){ t=new Thread(name){//匿名内部类继承Thread类 public void run(){//重写run方法 while(true){ System.out.println("name="+this.getName()+" i="+i); if(--i==0)return; } } }; t.start();//启动 } }
然后执行new InnerThreadTask("InnerThread").runTask();即可启动线程。
2、实现Runnable接口方式:
class InnerRunnableTask{ private Thread t; private String name; private int i=3;//每个线程执行3次 public InnerRunnableTask(String name){ this.name=name; } public void runTask(){//匿名内部类实现Runnable接口 t=new Thread(new Runnable(){//new Thread(Runnable r,String name); public void run(){//重写run方法 while(true){ System.out.println("name="+Thread.currentThread().getName()+" i="+i); if(--i==0)return; } } },name); t.start();//启动 } }
然后执行new InnerRunnableTask("InnerRunnable").runTask();即可启动线程。
二、线程池
JavaSE5新增的java.util.concurrent包中的Executors类提供了几种线程池,使得创建和管理线程更加方便。
1、CachedThreadPool:
JDK文档:创建一个根据需要创建新线程的线程池,但在以前构造的线程可用时将重用它们。
意思就是线程池内的线程可以被复用。
举例:先定义一个task。
class CachedTask implements Runnable{ private int i=10;//每个线程执行10次 public void run(){ while(true){ System.out.println("ThreadName="+Thread.currentThread().getName()+" i=" + i); if(--i==0) return; } } }
打印10遍线程名。
创建CachedThreadPool:
ExecutorService exec=Executors.newCachedThreadPool(); for(int i=10;i>0;i--){ exec.execute(new CachedTask());//执行给定的线程。 } exec.shutdown();
此处使用Executors类创建出CachedThreadPool线程池,同时执行10个线程,每个线程执行10次。
exec.shutdown();关闭线程池,防止新任务被提交。但会继续执行shutdown以前提交的全部任务,且不接受新任务。
2、FixedThreadPool:
JDK文档:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
意思就是可以限制线程池内线程数的个数,如果任务数超过了线程数,后面的任务就会以队列的方式来等待。
举例:同样先定义一个task:
class FixedTask implements Runnable{ private int i=1; public void run(){ while(true){ System.out.println("ThreadName="+Thread.currentThread().getName()+" i=" + i); if(--i==0) return; } } }
每个线程打印1遍线程名。
创建FixedThreadPool:
ExecutorService exec = Executors.newFixedThreadPool(5); for(int i=10;i>0;i--){ exec.execute(new FixedTask()); }
注意,此处限定了线程数最大为5,同时执行10个任务。如果前5个任务没有执行完,则后面的任务会一直等待到有可用的线程。
3、SingleThreadExecutor:
JDK文档:创建一个使用单个worker线程的Executor,以无界队列方式来运行该线程。
SingleThreadExecutor是只有单个线程的执行器,可以理解为线程数量为1的FixedThreadPool。
可以把SingleThreadExecutor当做一个FIFO队列来使用。
举例:定义task
class SingleTask implements Runnable{ private int i=10; public void run(){ while(true){ System.out.println("ThreadName="+Thread.currentThread().getName()+" i=" + i); if(--i==0) return; } } }
打印10遍线程名字。
创建SingleThreadExecutor:
ExecutorService exec = Executors.newSingleThreadExecutor(); for(int i=5;i>0;i--){ exec.execute(new SingleTask()); }
这里通过执行可以看出,在每个线程执行完后,才会执行下一个线程。
相关推荐
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
│ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...
## Java并发编程与Executor框架 随着计算机硬件技术的发展,现代CPU通常都是多核的,这为软件提供了并行计算的能力。Java的并发编程模型在这样的背景下变得尤为重要。为了简化多线程编程,Java标准库提供了`java....
《Java并发编程实践》是Java开发者必读的经典之作,由Brian Goetz等多位专家共同撰写。这本书深入浅出地探讨了Java平台上的并发问题,帮助读者理解和掌握如何编写高效、可靠且可维护的多线程应用程序。以下是该书...
`java.util.concurrent.Executor`框架提供了一种灵活的方式来创建线程池,常见的线程池实现包括: - **FixedThreadPool**:固定大小的线程池。 - **CachedThreadPool**:根据需要创建新线程,但会在线程空闲后终止...
在C++中,线程池是一种管理线程资源的有效方式,它可以提高程序的并发性能,减少线程创建和销毁的开销。本文将探讨线程池的实现原理,特别是基于给定代码片段的简单实现。 首先,让我们回顾一下多线程编程的经典...
- ** chap5 (并发编程)**:介绍如何利用线程池或异步API处理并发请求。 - ** chap4 (UDP广播与多播)**:实践使用UDP进行广播和多播通信。 - ** chap2 (数据编码与解码)**:讲解网络数据的编码格式,如ASCII、二...
线程池可以重用线程,减少线程创建和销毁的开销。 四大函数式接口 Java 中提供了四种函数式接口:Runnable、Callable、Predicate、Function。这四种接口可以用于描述不同的函数式编程模型。 Stream 流式计算 ...
创建和管理线程可以通过`std::thread`类实现,可以创建并启动新的线程,也可以与其他线程同步或通信。 线程间的同步和通信是多线程编程中的关键问题。为了防止数据竞争和死锁,C++提供了多种工具,如互斥量(`std::...
- **线程池**:通过预先创建一定数量的线程,可以高效地处理多个客户端请求。 - **信号量与互斥锁**:用于同步线程间的访问资源,防止数据竞争条件。 - **条件变量**:用于线程间通信,当满足特定条件时唤醒其他等待...
7. 并发与多线程:合理使用线程池,避免线程创建销毁的开销,利用锁优化并发性能,如使用乐观锁、读写锁等。 8. 热点代码分析:使用VisualVM、JProfiler等工具进行性能监控,找出性能瓶颈,针对性优化。 9. 字符串...
- **1.1 简短的历史回顾**:这部分简单回顾了并发编程的发展历史,强调了现代计算机系统对并发处理的需求。 - **1.2 线程的好处**: - **1.2.1 利用多处理器**:介绍如何通过多线程编程来提高程序性能,尤其是在...
- 实践并发编程,包括异步编程模型,如async/await关键字,以及Task类的使用。 - 分析和解决多线程环境下可能出现的问题,如线程安全和性能优化。 通过研究这些实例和文档,开发者不仅能提升自己的C#编程能力,还能...
1. **多线程编程**:在C#中,可以使用`System.Threading`命名空间来创建和管理线程,实现并发执行,提高程序效率。这涉及到线程同步、线程池、异步编程(async/await关键字)等概念。 2. **高级UI设计**:在...
#### 第十三章:AsyncIO并发编程 - **事件循环**:异步编程的核心机制。 - **协程嵌套**:在协程中调用其他协程。 - **`ThreadPoolExecutor`与`asyncio`结合**:将阻塞调用放在单独的线程中执行。 - **`asyncio`...
12. **多线程**:Java支持并发编程,多线程是实现并行处理的关键。讲解了线程的创建、同步机制(如synchronized关键字、wait/notify等)、线程池的使用。 13. **Socket网络编程**:这部分讲解了如何使用Java的...
5. **线程机制**:并发编程是现代软件开发的常态,理解线程的创建、同步、通信和死锁避免等知识,是编写高并发程序的基础。学会使用线程池,掌握互斥量、信号量、条件变量等同步原语,可以写出更加健壮的多线程程序...
以商品详情页面的展示为例,通常的做法是创建一个线程池,将各个服务调用封装成单独的线程任务,并提交到线程池执行,如下所示: ```java ExecutorService executorService = new ThreadPoolExecutor(3, 5, 60, ...
- 介绍如何利用多线程提高Socket服务器的并发处理能力。 - 包括线程池、线程同步等关键技术点。 #### 五、Socket编程笔记 ##### 5.2 内容详情 - **Socket编程常见问题及解决方案**: - 分享在Socket编程过程中...