1.创建线程的四种方式

1)继承Thread类创建线程

  • 自定义线程类继承Thread类,
  • 重写run()方法,编写线程执行体,
  • 创建线程对象,调用start()方法启动线程

2)实现Runnable接口创建线程

  • 自定义线程类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程

3)使用Callable和Future创建线程
1.实现Callable接口,重写call()方法,创建该实现类的实例
2.使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
3.使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

4)使用线程池例如用Executor框架
1.创建线程池,创建ExecutorService
2.使用service中的execute方法启动线程
3.关闭服务(service.shutdown)

2.Lock锁的简单使用

多线程基本操作
3. 与锁定的对比
4. synchronized和lock的区别

一:出身不同

  • Sync:Java中的关键字,是由JVM来维护的。是JVM层面的锁。
  • Lock:是JDK5以后才出现的具体的类。使用lock是调用对应的API。是API层面的锁

二:使用方式不同
Sync是隐式锁。Lock是显示锁
所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。
三:等待是否可中断
Sync是不可中断的。除非抛出异常或者正常运行完成
Lock可以中断的。中断方式:
1:调用设置超时方法tryLock(long timeout ,timeUnit unit)
2:调用lockInterruptibly()放到代码块中,然后调用interrupt()方法可以中断
四:加锁的时候是否可以公平
Sync;非公平锁
lock:两者都可以的。默认是非公平锁。在其构造方法的时候可以传入Boolean值(true:公平锁 false:非公平锁)
五:锁绑定多个条件来condition
Sync:没有。要么随机唤醒一个线程;要么是唤醒所有等待的线程。
Lock:用来实现分组唤醒需要唤醒的线程,可以精确的唤醒,而不是像sync那样,不能精确唤醒线程。
六:死等
.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
七:从使用锁的方式比较
多线程基本操作

相关文章: