`

并发编程回顾:线程创建与线程池

 
阅读更多

原先多线程并发编程的学习笔记和代码整理一下贴上来。

---------------------------------

线程创建与线程池

一、线程创建

创建一个线程的方式有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());
}

这里通过执行可以看出,在每个线程执行完后,才会执行下一个线程。

 

分享到:
评论

相关推荐

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

    掌握并发的钥匙:Java Executor框架深度解析

    ## Java并发编程与Executor框架 随着计算机硬件技术的发展,现代CPU通常都是多核的,这为软件提供了并行计算的能力。Java的并发编程模型在这样的背景下变得尤为重要。为了简化多线程编程,Java标准库提供了`java....

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    《Java并发编程实践》是Java开发者必读的经典之作,由Brian Goetz等多位专家共同撰写。这本书深入浅出地探讨了Java平台上的并发问题,帮助读者理解和掌握如何编写高效、可靠且可维护的多线程应用程序。以下是该书...

    Java多线程与并发库高级应用

    `java.util.concurrent.Executor`框架提供了一种灵活的方式来创建线程池,常见的线程池实现包括: - **FixedThreadPool**:固定大小的线程池。 - **CachedThreadPool**:根据需要创建新线程,但会在线程空闲后终止...

    C++ 线程池实现原理1

    在C++中,线程池是一种管理线程资源的有效方式,它可以提高程序的并发性能,减少线程创建和销毁的开销。本文将探讨线程池的实现原理,特别是基于给定代码片段的简单实现。 首先,让我们回顾一下多线程编程的经典...

    精通Visual C++网络编程

    - ** chap5 (并发编程)**:介绍如何利用线程池或异步API处理并发请求。 - ** chap4 (UDP广播与多播)**:实践使用UDP进行广播和多播通信。 - ** chap2 (数据编码与解码)**:讲解网络数据的编码格式,如ASCII、二...

    Java-JUC-多线程 进阶

    线程池可以重用线程,减少线程创建和销毁的开销。 四大函数式接口 Java 中提供了四种函数式接口:Runnable、Callable、Predicate、Function。这四种接口可以用于描述不同的函数式编程模型。 Stream 流式计算 ...

    C++面向对象多线程编程1-8

    创建和管理线程可以通过`std::thread`类实现,可以创建并启动新的线程,也可以与其他线程同步或通信。 线程间的同步和通信是多线程编程中的关键问题。为了防止数据竞争和死锁,C++提供了多种工具,如互斥量(`std::...

    Visual.C.网络高级编程4

    - **线程池**:通过预先创建一定数量的线程,可以高效地处理多个客户端请求。 - **信号量与互斥锁**:用于同步线程间的访问资源,防止数据竞争条件。 - **条件变量**:用于线程间通信,当满足特定条件时唤醒其他等待...

    JVM与性能优化知识点整理.rar

    7. 并发与多线程:合理使用线程池,避免线程创建销毁的开销,利用锁优化并发性能,如使用乐观锁、读写锁等。 8. 热点代码分析:使用VisualVM、JProfiler等工具进行性能监控,找出性能瓶颈,针对性优化。 9. 字符串...

    Java Concurrency in Practice

    - **1.1 简短的历史回顾**:这部分简单回顾了并发编程的发展历史,强调了现代计算机系统对并发处理的需求。 - **1.2 线程的好处**: - **1.2.1 利用多处理器**:介绍如何通过多线程编程来提高程序性能,尤其是在...

    C# 多线程 应用程序 实例 程序 说明文件

    - 实践并发编程,包括异步编程模型,如async/await关键字,以及Task类的使用。 - 分析和解决多线程环境下可能出现的问题,如线程安全和性能优化。 通过研究这些实例和文档,开发者不仅能提升自己的C#编程能力,还能...

    Windows应用高级编程-C#编程篇 续

    1. **多线程编程**:在C#中,可以使用`System.Threading`命名空间来创建和管理线程,实现并发执行,提高程序效率。这涉及到线程同步、线程池、异步编程(async/await关键字)等概念。 2. **高级UI设计**:在...

    python高级编程.pdf

    #### 第十三章:AsyncIO并发编程 - **事件循环**:异步编程的核心机制。 - **协程嵌套**:在协程中调用其他协程。 - **`ThreadPoolExecutor`与`asyncio`结合**:将阻塞调用放在单独的线程中执行。 - **`asyncio`...

    java编程基础教程(ppt版)

    12. **多线程**:Java支持并发编程,多线程是实现并行处理的关键。讲解了线程的创建、同步机制(如synchronized关键字、wait/notify等)、线程池的使用。 13. **Socket网络编程**:这部分讲解了如何使用Java的...

    编程高手箴言

    5. **线程机制**:并发编程是现代软件开发的常态,理解线程的创建、同步、通信和死锁避免等知识,是编写高并发程序的基础。学会使用线程池,掌握互斥量、信号量、条件变量等同步原语,可以写出更加健壮的多线程程序...

    基于JDK的ForkJoin构建一个简单易用的并发组件1

    以商品详情页面的展示为例,通常的做法是创建一个线程池,将各个服务调用封装成单独的线程任务,并提交到线程池执行,如下所示: ```java ExecutorService executorService = new ThreadPoolExecutor(3, 5, 60, ...

    细细品味C#(Socket编程).pdf

    - 介绍如何利用多线程提高Socket服务器的并发处理能力。 - 包括线程池、线程同步等关键技术点。 #### 五、Socket编程笔记 ##### 5.2 内容详情 - **Socket编程常见问题及解决方案**: - 分享在Socket编程过程中...

Global site tag (gtag.js) - Google Analytics