启动线程的三种方式(若是创建线程还有一个利用线程池创建的方式):
目录
启动线程的三种方式(若是创建线程还有一个利用线程池创建的方式):
4.newScheduledThreadPool(int n)
一.继承thread类方式
1.创建一个类继承thread类
2.重写run方法
3.创建这个类的对象
4.这个对象调用start()方法开启线程
二.实现Runnable接口的方法
1.定义一个类实现Runnable接口
2.重写run方法
3.新建一个测试类创建Thread类的对象和这个实现类的对象,并将这个实现类的对象作为参数传给Thread的构造函数
Thread thread = new Thread(runn);
4.调用这个Thread类的start方法
三.实现Callable接口
1.创建一个类实现Collable接口,并重写call方法,Collable接口中的参数是从call方法找那个返回值的类型
2.生成Collable类的实例
3.生成FutureTask类的实例并把Collable类的实例传进去做参数
4.生成Thread类的实例,并把FutureTask类的实例传进去当参数
5.调用start方法开启线程
6.通过FutuerTask类的对象的get()方法来获取线程结束后的返回值
线程池问题:
写在前面:
线程池概念:
就是创建一些线程,他们的集合叫做线程池。
作用:
1.提高速度:每次不用再新建线程,直接从线程池中拿就可以了
2.节约资源:通过重复使用已经创建的线程降低线程创建和销毁所带来的资源消耗
3.提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一分配、调优和j
一.几种线程池的简单介绍
1.newSingleThreadExecutor
只创建唯一的工作线程来执行任务
每个任务都会在下一个任务开始之前结束,所有的任务都使用相同的线程,可保证顺序的执行各个任务。
2.newCachedThreadPool
可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务。
线程池为无限大,当执行当前任务时,上一个任务已经完成,会重复使用上一个任务的线程而不用重复建立线程
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
3.newFixedThreadPool(int n)
可重用固定个数线程池,以共享的无界队列方式来运行这些线程
n代表有n个线程会被重复使用(若忘记什么意思,下面有个链接,里面有对应的例子一看便懂)
每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中
4.newScheduledThreadPool(int n)
创建一个定长线程池,线程个数应该是n个
/创建一个定长线程池,支持定时及周期性任务执行——定期执行
10 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
11 //延迟1秒后每3秒执行一次
12 scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
13 public void run() {
14 System.out.println("延迟1秒后每3秒执行一次");
15 }
16 }, 1, 3, TimeUnit.SECONDS);
对应每种线程池的代码https://blog.csdn.net/hnd978142833/article/details/80253784
同步异步问题:
1.同步:
就是需要等待返回结果
同步就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回,但是一旦调用返回,就得到返回值了。简单的为:就是由*调用者*主动等待这个*调用*的结果。
同步是用于确保资源一次只能被一个线程使用的过程
2.异步:
不需要等待返回结果
*调用*在发出之后,这个调用就直接返回了,所以没有返回结果;换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
生活案例
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
锁:
一.synchronized:
有一个共享资源,我们只允许一次一个线程访问它。把所有能访问该资源的方法都封装到一个类中,然后把这些方法全都加上synchronized关键字,如果这时候有一个线程正在调用一个该关键字标记的方法,那么当这个线程从该方法返回之前,其他所有要调用该关键字所标记的方法的线程都会被阻塞。
二:Lock
https://www.jianshu.com/p/b1581c35c881 //这个网址讲锁讲的特别好
匿名内部类实现线程的两种方式
1. new Thread(){
public void run(){
system.out.println("");
}.start();}
2.new Thread(new Runnable()
{
public void run(){
sout();
}
}).strat();