Java 线程与线程池简例

本文介绍Java中实现线程的两种方法:继承Thread类和实现Runnable接口,并对比start和run方法的区别。同时,详细解析了线程的五种状态,并介绍了线程池的概念及其四种类型:可缓存线程池、固定线程池、定时线程池和单线程化线程池。
实现线程有两种方法
1. 继承 Thread 类, 重新 run 方法, 调用类的 start 方法启动线程
2. 实现 Runnable 接口, 实现 run 方法, 通过 new Thread(Runnable).start() 启动线程
线程有五种状态, 创建、就绪、运行、阻塞、死亡

创建: 实例化对象

就绪: 实例化对象, 调用 start 方法

运行: 线程调度器将就绪的线程设置为当前线程
阻塞: 线程正在运行时, 被暂停之后再继续运行, 如 sleep suspend wait 等方法导致线程阻塞
死亡: run 执行完毕或调用 stop 方法
start 和 run 方法区别: 
start 方法启动线程, 实现多线程运行(并行)

run 方法为普通方法调用, 程序按调用顺序执行

继承方式:

public class ExtendThread extends Thread {

	private String str;

	public ExtendThread(String str) {
		this.str = str;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(str + ":" + i);
		}
	}

	public static void main(String[] args) {
		new ExtendThread("T1").start();
		new ExtendThread("T2").start();
	}

}

接口方式:

public class RunnableThread implements Runnable {

	private String str;

	public RunnableThread(String str) {
		this.str = str;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(str + ":" + i);
		}
	}

	public static void main(String[] args) {
		new Thread(new RunnableThread("T1")).start();
		new Thread(new RunnableThread("T2")).start();
	}

}
使用线程池来跑线程
new Thread(task).start() 的缺点:
消耗性能、缺乏管理、可无限创建导致占用过多系统资源
线程池的优点:
重用存在的线程,减少对象创建,可有效控制最大并发线程数,提高系统资源的使用率
Executor 提供4种线程池
newCachedThreadPool
创建一个可缓存的线程池(大小是不定值),调用 execute 将重用以前构造的线程,如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程
newFixedThreadPool
创建固定数目线程的线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,当上一个执行完之后才会执行第二个

示例:
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import org.junit.Test;

public class ThreadPool {

	// 创建一个固定数量的线程池 pool-1
	Executor executor = Executors.newFixedThreadPool(10);

	Runnable task = new Runnable() {
		@Override
		public void run() {
			System.out.println("当前线程:" + Thread.currentThread().getName());
		}
	};

	@Test
	public void runTask() {
		for (int i = 0; i < 15; i++) {
			executor.execute(task);
			// new Thread(task).start();
		}
	}

}
运行结果:在 pool-1 线程池中,总共只会跑出 10 个线程
如果使用 new Thread() 则会跑出 15 个线程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值