线程
概念
一个独立的执行路径,存在于进程中,一个进程至少有一个线程。
多线程实现方式
继承Thread类
步骤:
- 自定义一个类,继承Thread类
- 重写Thread类中的run方法,用于定义新的要执行的内容
- 创建自定义类型的对象
- 调用线程开启的方法,start()方法
实现Runnable接口
步骤:(或者可用匿名内部类的方式)
- 定义一个任务类,实现Runnable接口
- 重写接口中的run方法,用于定义任务内容
- 创建任务类对象,表示任务
- 创建Thread类对象,将任务对象作为构造方法的参数传递,用于执行任务的类对Thread(Runnable r)
- 调用线程开启的方法,start()开启新线程
实现Callable接口
思路:
如果创建Thread,执行Runnable任务,需要Runnable对象
Runnable是一个接口,有一个特殊的实现类
FutureTask是Runnable的一个实现类
FutureTask在创建对象的时候,需要传递Callable的对象(FutureTask没有空参构造)
Callable是一个接口,所以需要一个Callable的实现类对象
步骤:
- 定义一个自定义类实现Callable接口
- 在自定义类中重写call()方法
- 创建自定义类对象
- 创建FutureTask对象,把自定义类的对象作为构造方法的参数传递给FutureTask
- 创建Thread类对象,把FutureTask对象作为构造方法的参数
- 使用Thread类对象调用start方法启动线程
- FutureTask对象调用get方法,可以获取到线程运行结束之后的结果
call()方法就相当于run()方法
call()方法与run()方法区别:
run没有任何方法的返回值结果,也不能抛出任何异常
call方法中可以有返回值,也可以抛出异常
常问:
sleep()和wait()区别
- 所在类不同: sleep()是Thread类的静态方法;wait()是Object类的方法
- 锁释放不同: sleep()是不释放锁的;wait()是释放锁的
- 用法不同: sleep()方法睡眠指定时间之后,线程会自动苏醒
- wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程
run()和start()区别
- start方法用来启动相应的线程;
- run方法只是thread的一个普通方法,在主线程里执行;
- 需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;
反射
反射技术的源头就是Class对象。
反射概念
在class文件运行过程中,动态获取类中的内容(方法、属性等),可以进行改变,将其扩展性提高。
**注意:**任意类型包括基本类型以及void都有对应的Class 对象。
获取Class对象的方式
- 对象.getClass();
- 类名.class;
- Class.forName(“全类名”);
暴力反射: setAccessible(true)