zoukankan      html  css  js  c++  java
  • 2019/3/7 Java学习之多线程(基础)

                                                                                                                                                            Java学习之多线程

    讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程。线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可以继续运行。学习多线程需要有一种多并发的思想,要摒弃以往的那种面向过程式编程,以前一直觉得程序在运行的时候只会跟著代码一步一步的走,只能沿着一条时间线,现如今学到了java的多线程才是打开了我新世界的大门。Java是一门伟大的语言,必须要认真的学习之精髓。

      首先了解一下3种创建多线程的方式。

    1. 创建新类,通过继承Thread并且重写run方法,开启新线程的时候,run中的方法就是这个线程所要干的事情。然后实例化,在用.Start()来真正开启新线程。
    2. 创建新类,继承Runnable接口,然后实现run方法,新线程开启后,执行的是run中的方法。真正开启的时候,是创建一个Thread实例,再往Thread(加入参数)实例中加入该新类的实例以作为创建的参数。
    3. 匿名类方法开启新线程,在main函数下创建Thread实例的同时重写run方法,这个方法不要求创建新类,而且可以根据需求随时方便的改变方法内容。

    3种方法各有益处,看喜欢哪样了!

    在多线程情况下,对同一数据进行操作有很大可能导致数据的不同步,也就是导致数据错误,软件的安全性永远在第一位,因此,在如何保证性能最大化的同时也应该把安全放在第一位。

    在这个背景下,锁因运而生。锁可以保证在这一时间下除了占有该对象的线程,其他的线程均不能访问这个对象,只有占有完了结束了其他的线程才可以访问。锁的同时还要伴随着线程的交互。关键字wait()是令当前线程释放目前占有的对象并且休眠,直到唤醒并满足运行条件,该线程就会继续工作。关键字notifyAll()是唤醒其他所有等待这个对象的线程,就像一帮等待着食物的猪一样,那头猪吃完了不吃了就唤醒其他的猪叫他们来食用。一般run方法运行完了都会在后面添加notify(),这样可以保证所有等待的线程可以醒来。JDK6以后又新增加了lock方法来进行锁对象。Lock有着与synchornized 不一样的特性,synchornized会一直试图获取对象的使用权,不得到不罢休,一直到天荒地老,直到电脑没电停机了。这样会导致死锁问题,死锁问题是线程1一直占有对象a等待2线程释放对象b,而线程2一直占有对象b,等待1释放a。。。。如此就会导致死锁,这样两个线程就废了!Lock则完美的解决了这个问题,locktrylock方法可以提供时间,时间是努力争取一段时间的时间,如果争取不了,就放弃。这样就不会死锁了。Lock有很多的特性,希望在以后的项目中可以进一步的深入了解。此外,lock伴随着conditionconditionawait()对标wait(),它的signalAll(),对标notify(),其他的都差不多的。

      创建新的线程会消耗系统的性能,如果频繁的创建,会导致系统变慢,不利于软件的高效率运行。如果能够创建一个线程池,用的话就加入,完了就回来继续等待任务的开始,这样就可以保证效率啦!建方法:

    import java.util.concurrent.LinkedBlockingQueue;

    import java.util.concurrent.ThreadPoolExecutor;

    import java.util.concurrent.TimeUnit;

    ThreadPoolExecutor pool = new ThreadPoolExecutor(  A ,  B ,  C  ,  D ,  E  )

    A:开始线程的个数

    B:不够用后扩容后的个数

    C:结合 D的时间尺度类如TimeUnit.SECONDS,过了C秒后没活干就回收!保持A

    D:时间尺度

    E:  LinkedBlockingQueue<Runnable> 类型的容器

    原子访问:就是线程安全的方式,只能保证一次操作是安全的,所以i++i+=6,是非原子访问。AtormicInterger A = new AtormicInterger(  0  ).表示创建线程安全的为0的基于int类型的数;

    1. incrementAndGet()表示自加1
    2. decrementAndGet()表示自减1
    1. addAndGet3) 表示自加3

    好了,以上是java线程的初步学习,以后会补充深层次的知识点和理解。

    2019/3/7 11

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/qq1005801715/p/10493243.html
Copyright © 2011-2022 走看看