Java专题 Thread线程生命周期 线程池开启+简单案例

Thread 生命周期

线程类提供的状态如下:

Thread.State.BLOCKED;
Thread.State.NEW;							// 新建态,没有开启线程
Thread.State.RUNNABLE;						// 就绪态和运行态
Thread.State.TERMINATED;					// 消亡(结束)态
Thread.State.TIMED_WAITING;					// 阻塞态调用了有时间限制的wait方法、sleep方法)
Thread.State.WAITING;						// 阻塞态(调用了wait方法,等待其他线程唤醒的状态)
//	从诞生,到活跃状态,再到最后的消亡状态
	
	//线程中关于状态的描述
	Thread thread = new Thread() {		//匿名创建线程
		@Override
		public void run() {
			String s1 = "";
			for (int i = 0; i < 10; i++) {
				s1+=i;
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	};
	System.out.println(thread.getState());		//新建状态
	thread.start();				//开启线程
	while (true) {
		System.out.println(thread.getState());		//运行状态		//也会出现阻塞状态
		if (thread.getState().equals(Thread.State.TERMINATED)) {	//当状态等于消亡状态时
			System.out.println(thread.getState());					//打印消亡状态
			break;													//结束
		}
	}
	
	thread.getState();
//	Thread.State.BLOCKED;
//	Thread.State.NEW;							//新建态,没有开启线程
//	Thread.State.RUNNABLE;						//就绪态和运行态
//	Thread.State.TERMINATED;					//消亡(结束)态
//	Thread.State.TIMED_WAITING;				//阻塞态调用了有时间限制的wait方法、sleep方法)
//	Thread.State.WAITING;					//阻塞态(调用了wait方法,等待其他线程唤醒的状态)

线程池

没有线程池的状态
当我们使用一条线程的时候,先将线程对象创建出来,启动线程,在运行过程中,可能能完成任务,也可能会在中途被任务内容中断掉,任务还没有完成。
即使是能够正常完成,线程对象就结束了,就变成了垃圾对象,需要被垃圾回收器回收
如果在系统中,大量的任务都是小任务,任务消耗时间较短、线程对象的创建和消亡耗费的时间
比较多,结果:大部分的时间都浪费在了线程对象的创建和死亡上。
如果任务本身破坏力比较大,可能会把线程对象结束掉,就无法继续完成任务。

有线程池的状态:
在没有任务的时候,先把线程对象准备好,存储到一个容器中,一旦有任务来的时候,就不需要
创建对象,而是直接将对象获取出来执行任务
如果任务破坏力较小,任务可以直接完成,这个线程对象不会进入死亡状态,而是被容器回收,继续活跃。
如果任务破坏力较大,任务会把线程搞死,线程池会继续提供下一个线程,继续完成这个任务。

创建线程池

//工具类:Executors:生成线程池的工具类,根据需求生成指定大小的线程池
	
	//创建线程池
	ExecutorService es = Executors.newSingleThreadExecutor();		//创建单线程的线程池
	ExecutorService es2 = Executors.newFixedThreadPool(5);		//创建五个线程的线程池
	
//	ExecutorService:是一个接口,不需要手动创建这个接口的实现类对象,使用方法获取到的
//	就是这个接口的实现类对象,一定可以调用这个接口中的方法
	
//	创建任务类对象:Runnable的实现类对象,用于定义任务内容
	Runnable r1 = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for (int i = 0; i < 50; i++) {
				System.out.println(i);
			}
		}
	};
	Runnable r2 = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for (int i = 100; i < 150; i++) {
				System.out.println(i);
			}
		}
	};
	Runnable r3 = new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for (int i = 150; i < 200; i++) {
				System.out.println(i);
			}
		}
	};
	
	es2.submit(r1);		//submit(runnable r)直接将任务对象写入    线程池会自动处理 不需要start
	es2.submit(r2);
	es2.submit(r3);
	
	es2.shutdown();			//结束线程池  将已经提交的全部做完并不允许再提交
	es2.shutdownNow();		//结束线程池  已经开始的保证做完,但没有开始的已经提交的不再处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值