多线程入门

1、Runnable与Thread

A:实现接口方式的好处

     第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。

     实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。

     继承Thread类,线程对象和线程任务耦合在一起。

     一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。

     实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

     (降低紧密性或者依赖性,创建线程和执行任务不绑定)

2、线程池的原理

      1.在java中,如果每个请求到达就创建一个新线程,开销是相当大的。

      2.在实际使用中,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。

      3.除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。

        如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。

        为了防止资源不足,需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务。

      线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。

 

3、 Callable接口

    *工厂类 Executors静态方法newFixedThreadPool方法,创建线程池对象

    *线程池对象ExecutorService接口实现类,调用方法submit提交线程任务

    *submit(Callable c)

4、线程安全问题

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。

    程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

5、 synchronized

    synchronized (锁对象) {

       可能会产生线程安全问题的代码

     }

6、lock

    lock() 获取锁

    unlock()释放锁

    实现类ReentrantLock

7、死锁

     当线程任务中出现了多个同步(多个锁)  时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。

8、线程等待与唤醒

    wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中。

    notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。

    notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值