概述
一、多线程
1、什么是多线程?
线程是操作系统调度的最小单元,在一个进程里可以创建多个线程,这些线程拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在多线程中高速切换,达到“同时运行”的效果。
2、多线程的创建方式
- 继承Thread类
- 实现Runnable接口,重写run()方法
- 实现Callable接口,重写call方法
3、线程的启动方式
/**
* 1、继承Thread
*/
public void createByThread(){
Thread thread = new TestThread();
thread.start();
}
/**
* 2、实现Runnable
*/
public void createByRunnable(){
Thread thread = new Thread(new TestRunnable());
thread.start();
}
/**
* Callable方式
*/
public String createByCallable() throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<String>(new TestCallable());
Thread thread = new Thread(futureTask);
thread.start();
System.out.println(futureTask.get());
return futureTask.get();
}
4、线程有什么状态
- NEW :初始化状态,线程被构建,但没有调用start()方法。
- RUNNABLE :运行状态,java线程将操作系统中的就绪、运行两个状态统称为运行状态
- BLOCKED :阻塞状态 ,线程阻塞于锁
- WAITING:等待状态,线程进入等待状态,此时需要其他线程做出一下动作(通知或者中断)
- TIME_WAITING:超时等待状态,可以在指定时间自动返回
- TERMINATED:终止状态,线程已经执行完毕。
5、线程如何终止
- 设置flag进行控制,线程代码运行完毕
- 使用stop方法。现在已经过期不建议用,因为不保证线程资源正常释放,通常没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。
- 结合interrupt和isInterrupted、interrrupted。
- 中断可以理解为线程的一个标识位属性,它表示线程是否被其他线程进行了中断操作。其他线程调用interrupt()方法对其进行中断操作。
- 线程自身通过调用isInterrunpted()方法判断是否被中断,或者调用静态方法Thread.interrupted对当前线程的中断标识进行复位。
二、线程池
1、什么是线程池?
线程池管理多个线程的创建以及销毁,可以预先的创建多个线程,将提交上来的任务合理分配给线程执行。线程池可以降低资源消耗,提高响应速度以及提高线程的可管理性。
2、几种线程池的创建
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程(保存60s),若无可回收,则新建线程。
ExecutorService executorService = Executors.newCachedThreadPool();
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService executorService2 = Executors.newFixedThreadPool(2);
// 创建一个定长线程池,支持定时及周期性任务执行。
ExecutorService executorService3 = Executors.newScheduledThreadPool(1);
//创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
ExecutorService executorService4 = Executors.newSingleThreadExecutor();
3、线程池的使用
- 调用执行器Executors创建线程池
- 调用submit()或者execute()方法,传入线程对象
- 当不需要执行线程任务时,调用shutdown关闭线程池
System.out.println("=========线程池的使用=========");
//submit底层调用execute方法执行任务
executorService.submit(new TestThread());
//传入Runnable
executorService.execute(new TestRunnable());
//传入Callable 并接收线程返回值
Future<String> future1 = executorService.submit(new TestCallable());
System.out.println("线程池方式启动Callable结果:"+future1.get());
System.out.println("=====关闭线程池======");
executorService.shutdown();
最后
以上就是俊逸高山为你收集整理的多线程与线程池的基本概念与方法的全部内容,希望文章能够帮你解决多线程与线程池的基本概念与方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复