这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
线程
java开发中,多线程时一个绕不开的话题,下面我们来介绍下java线程的一些基本操作和尝试用的线程类。
1.run()和start()的区别
- start:用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
- run:run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
2.使用匿名类创建线程
如果一个对象只是用一次,可以使用匿名。
例如:
//创建实现类对象
StartRun st = new StartRun();
//创建代理类
Thread t = new Thread(sr);
//启动
t.start();
如果使用匿名类,则可以简化为:
new Thread(new StartRun()).start();
3.Thread类、Runnable接和Callable接口
推荐使用Runnable接口,好处是:
-
接口可以实现多个,突破单继承。
-
便于共享资源。因为一个线程只能启动一次,通过Thread实现线程时,线程和线程所要执行的任务是捆绑在一起的。而一个任务可以启动多个线程,通过Runnable方式实现的线程,实际是开辟一个线程,将任务传递进去,由此线程执行。
-
Callable接口 Callable接口用于juc并发编程
- Callable规定的方法是call(),而Runnable规定的方法是run()。
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
- call()方法可抛出异常,而run()方法是不能抛出异常的。
- 运行Callable任务可拿到一个Future对象。
Future
Callable任务返回Future对象。即:Callable和Future一个产生结果,一个拿到结果。Future 表示异步计算的结果。
4.守护线程
守护线程只为用户线程服务,JVM不用等待守护线程结束才结束。而JVM默认会等用户线程结束才会结束。