`

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

 
阅读更多

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

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

线程创建与线程池

一、线程创建

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

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

 

分享到:
评论

相关推荐

    并发编程之线程与线程池.pptx

    并发编程之线程与线程池.pptx 内部培训PPT 多线程 线程池

    java并发编程:juc线程池

    不了解并发编程和线程池的开发者可能会面临多线程竞争、死锁等问题。通过深入了解 Java 并发编程和 JUC 线程池,您可以更好地管理线程之间的协作和同步,充分发挥多核处理器的优势,确保程序稳定运行。 了解 Java ...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    Java并发编程:线程池的使用 - 平凡希 - 博客园平凡希博客园首页联系管理随笔 - 127 文章 - 1 评论 - 94Java并发编程:线程池的使用在前面

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    Java并发编程:设计原则与模式(第二版)

    Java并发编程:设计原则与模式(第二版).pdf

    Java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的...

    Java并发编程:设计原则与模式(第二版)-3

    Java并发编程:设计原则与模式(第二版)

    java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...

    Java并发编程:设计原则与模式(第二版).rar

    Java并发编程:设计原则与模式(第二版)

    java并发编程:设计原则与模式.rar

    java并发编程:设计原则与模式.rar

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

    Java并发编程常见知识点源码集锦,涉及到对象锁,Executors多任务线程框架,线程池等示例,列出一些源码包中包括的内容:  volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小...

    【并发编程】如何优雅使用线程池.pdf

    基本概念:介绍并发编程的基本概念,如进程、线程、并行与并发的区别等。 同步机制:讲解如何使用锁、信号量、原子操作等同步机制来避免竞态条件和死锁。 并发模型:介绍不同的并发模型,如生产者-消费者模型、管道...

    Java 线程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    第二部分引入了ClassLoader,这是因为ClassLoader与线程不无关系,我们可以通过synchronized关键字,或者Lock等显式锁的方式在代码的编写阶段对共享资源进行数据一致性保护,那么一个Class在完成初始化的整个过程到...

    高并发和并发编程

    高并发和并发编程并发编程:线程安全+线程封闭+线程调度

    23 高并发编程和线程池

    23 高并发编程和线程池,教程视频:java中高并发编程和线程池

    【并发编程】自定义简单线程池.pdf

    基本概念:介绍并发编程的基本概念,如进程、线程、并行与并发的区别等。 同步机制:讲解如何使用锁、信号量、原子操作等同步机制来避免竞态条件和死锁。 并发模型:介绍不同的并发模型,如生产者-消费者模型、管道...

    Java并发编程的设计原则与模式

    Java并发编程:设计原则与模式Java并发编程:设计原则与模式

Global site tag (gtag.js) - Google Analytics