初识
实现方式
第一种实现方式:(继承thread类的方式实现)
第二种实现方式:(实现runnable接口方式进行实现)
key01:
第三种实现方式:(利用callable接口和future接口方式实现)
常用成员方法
key01:构造方法不能够继承,子类想使用父类的构造方法就需要使用到super关键字。
用来创建对象时初始化对象,即为对象成员变量赋初始值,总是与new运算符一起使用在创建对象的语句中。特别的,一个类是可以有多个构造函数,可以根据参数个数的不同或者参数类型的不同来区分它们,即为构造函数的重载。
格式如下:
修饰符 方法名(){}
其中需要注意的是:
- 方法名与类名相同;
- 没有返回值类型;
- 没有具体的返回值。
注意事项
① Java中的每一类至少有一个构造方法,如果我们没有去创建,系统自动会为我们创建一个默认的无参构造方法;
②但是如果我们定义了构造方法,系统就不会再为我们提供默认的无参构造方法了。这个时候想使用无参构造方法必须自己定义。因为实例化对象时,不一定会输入参数,那么没有无参的构造方法,又不输入参数,就会出错;
③构造方法需要用public来修饰,若使用private,在其他类中无法将其实例化;
④构造方法是可以重载的。所谓重载,是指一个类中可以定义多个方法名相同,但是参数不同的方法。调用时,会根据不同的参数自动匹配对应的方法。
key02:
key03:
子类重写父类的方法,如果父类没有抛出异常,子类也不能抛出异常只能try-catch;
在子类初始化时会自动调用父类的无参构造方法(只调用无参构造方法,不调用带参构造方法)
子类也可以手动调用父类的无参构造方法(使用super关键字)
总结:子类初始化时不会自动调用父类的带参构造方法,如果用到了父类的带参构造方法,则需要手动去调用,手动调用父类的构造方法后,子类不再自动调用父类的无参构造方法;
注意:不管是子类手动调用父类的无参构造方法,还是手动调用父类的带参构造方法,代码必须写在子类构造方法的第一行
key04:(应用--qq聊天窗口传输文件)
生命周期
安全性问题
key01:写run四步曲
将线程休眠代码写在同步代码块的外面,可以让其线程优先级均匀
key02:
StringBuffer是线程安全的,StringBuilder是线程不安全的。多线程使用StringBuffer
key03:
lock.unlock();一般写在finally中。“避免有人上厕所关门,然后跳窗跑了,导致所有人一直在外面等”
线程状态
线程池
key01:线程池参数
key02:
parameter02:Runtime.getRuntime().availableProcessors();可以获取虚拟机可以使用的处理器数量
parameter04:TimeUnit.SECONDS或者TimeUnit.MINUTE
parameter05:new ArrayBlockingQueue<>() 指定长度
new LinkBlockingQueue 不指定长度
parameter06:Executors.defaultThreadFactory内有创建线程方法
parameter07:使用内部类,依托于外部类的存在而有意义
key03:线程池大小
CPU繁忙型:+1是为了保证,当某个线程因为系统中断而阻塞,有备用线程可以上处理机运行保证cpu利用率很高
I/O密集型:965来说,老板看到你在公司每天上班7小时,但是你自己得把杂七杂八时间算进去假如也是7小时。那么可以说你一天得工作14小时。带权时间