进程包含线程,如一个百度网盘进程,该进程的线程可以有上传,下载。
1.常规写法
2.匿名内部类写法
示例代码:
f1.get()方法得到call方法的返回值
也就是说当线程执行完后,get()方法才执行,这样才能得到线程执行完后的返回值。
示例代码:
1.getName()方法获取线程名称
2.setName(字符串)方法为线程取名
3.构造器super(name)方法为线程取名
4.sleep(毫秒值)线程睡眠
5.join()让当前该线程先执行完,其他线程再执行
1.对于静态方法,synchronized(类名.class)
2.对于示例方法,synchronized(this)
synchronized不但可以修饰方法,还可以修饰成员变量、静态变量等。
同步代码块锁的范围更小,性能更好,因为需等待的范围小
1.创建锁对象,并多态写法,建议用final修饰
2.加锁和解锁,解锁一定要放在finally里,因为中间代码一旦出错,未解锁的话,该实例的其他线程会一直等待解锁
wait()、notify()及notifyAll()方法。
示例代码:
参数五任务队列可以是new ArrayBlockingQueue<>(n)表示n个缓存队列,new LinkedBlockingQueue<>()表示可以无限多个队列。任务队列是指线程排队的队列
参数六线程工程可以是Executors.defaultThreadFactory()表示使用默认的线程工程。
参数七任务拒绝策略如果是new ThreadPoolExecutor.AbortPolicy()表示抛异常进行处理。
注意事项
线程池并没有死亡
线程池的关闭
创建临时线程
都满了,执行任务策略
pool就是线程池对象
注意事项:
并发的每次处理16个线程,所以说并发和并行同时进行的
sleep方法不会释放锁权限。
悲观锁示例代码:
出现了线程安全问题
乐观锁示例代码: