多线程

作者: 青楼楼长 | 来源:发表于2019-11-24 12:22 被阅读0次

    一部分。相关概念解释

    为什么是多线程不是多进程:线程是进程的一个的执行单元,就像进程对于操作系统来讲一样。使用多线程的优点:

    1.进程之间不能共享内存,但是线程之间共享内存非常容易。

    2.系统创建进程时需要为该进程重新分配系统资源,但会创建线程的代价就小很多,因此效率较高。

    3.java语言内置了很多多线程的功能,而不是单单的作为底层操作系统的调度方式,从而简化了java的多线程开发。

    二部分。线程的创建方式

    4.创建线程的方式有几点提一下

    第一个继承thread类重写run方法(run方法即线程执行体),第二个实现runnable接口这两者直接调用实例对象的start()方法其中runnable的实例子类是作为thread的target的,还有个callable接口的这个有返回值,类型是Future类型,但是这个类型不能作为thread的target有一个FutureTask实现类,这个类还是实现了runnable接口,既然都实现了runnable接口了,你说呢^O^,^O^其实futuretask接收call的返回值是吧callable的实例作为参数放入futuretask的构造方法的。

    对比一下这三种创建方式:

    thread

    优点:编写简单获取当前线程可以直接this关键字而非thread.currentThread()

    缺点:既然已经继承了一个类就不能在继承其他的类了。

    接口方式:runnable和callable

    优点:实现了接口还可以继承其他的类,而且多个线程之间可以共享同一个target对象。thread就不行。

    缺点是:编程稍微复杂,获取前线程需要thread.currentthread()来获取

    callable与runnable的区别,callable有返回值,可以声明抛出异常而已。

    三部分。线程的生命周期:

    多线程

    四部分。线程的控制

    1. join(),调用线程执行完毕之后程序在继续往下执行。

    2.setDaemon(true)设置后台线程

    3.sleep()线程睡眠,调用进入阻塞状态知道sleep时间完才进入就绪状态。里面声明了异常的interruptedException

    4.yield()线程让步,让调度器重新调度一次,只会让同级和比他更高级的来获取资源执行不排除他自己又被调度到了接着执行。

    sleep与yield的区别:

    1.sleep会让出执行机会不会关线程优先级,而yield会。

    2.sleep进入阻塞时间完了才进入就绪,而yield直接进入阻塞

    3.sleep声明抛出interruptedexception异常,所以调用的时候要么捕获要么抛出。yield没有声明抛出任何异常。

    4.sleep比yield更有移植性通常不使用yield来控制并发线程的执行。

    5 setpriority()改变线程优先级,默认是和创建他父亲的优先级相同。虽然java提供了10个优先级但是和其他系统不能很好的对应,一般我们用三个静态常量 MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY。来设置优先级。保证移植性。

    五部分。线程同步

    1.同步监视器的通用方法是同步代码块

    2.同步方法:在方法上面加上synchronized

    那什么时候释放同步监视器的锁定呢?

    a:正常运行结束,b:异常结束,c:执行了wait()方法,注意thread.sleep()和thread.yield()不会释放。

    3.lock功能更强大的线程同步机制,synchronized能做到他都能做,而且还有更强大的方法,比如获取可中断锁,超时失效锁等。为Lock提供了reentrantLock(可重入锁)readwritelock(读写锁,允许共享资源并发访问)其中lock和reentrantlock是java5提供的两个跟接口。然后就是死锁那几个条件。

    六部分,线程通信


    主要有三种

    1.synchronized的监视器调用wait(),notify(),notifyall()

    2.lock的condition:首先获取lock.newcondition();condition的await(),signal(),signall()

    3.阻塞队列(blockingqueue),put()放入队列队列满了阻塞对比其他返回值(offer(),add()),take取队列,队列空了阻塞对比其他的返回值(remove(),poll())

    相关文章

      网友评论

          本文标题:多线程

          本文链接:https://www.haomeiwen.com/subject/kyrlwctx.html