java并发学习

          线程是进程内部的一个控制序列流,因此一个进程内可以有多个线程。

          线程最简单的做法是从java.lang.Thread继承,然后覆盖run()方法,实现你所需要的功能。在run()方法返回的地方,线程机制将终止此线程。

          start()方法启动线程,然后由线程执行机制调用run()方法。

           getName():可以获得线程的名字。

            有时候创建线程并没有获得对他的引用,对于普通对象而言,这将使它成为垃圾回收器要回收的目标,对于Thread对象就不会了,因为每个Thread对象都需要注册自己,在某个地方保存着对自己的引用,垃圾回收机制只有在线程离开run()并且死亡之后才能回收。

           yield():让步

           sleep():休眠,由于sleep()在休眠到期之前可能被中断,所以会抛出InterruptedException异常。

           setPriority():设置线程优先权,一般只设三个值。

           setDaemon():后台线程,必须在线程调用之前设置后台线程,可以用isDaemom()判断线程是否是后台线程,后台线程创建的任何线程都是后台线程,后台线程在非后台线程结束后,后台线程也将结束。

 

           join():一个线程可以在其他线程之上调用join()方法,会抛异常。如果A线程中调用B.jion(),则A线程将会被挂起,直到B线程结束,才会恢复。可以用B.isAlive()判断B线程是否结束,当调用B.interrupt()(会抛出异常)方法时,B线程将会被中断,B.isInterrupted()返回为真,当在异常捕获时调用B.isInterrupted()时,返回为假,因为异常捕获会清理这个标志。

          实现Runnable接口,也可以创建线程,只需要实现Runnable接口的Run()方法。Thread从Runnable接口实现而来的。

          实现Runable接口的线程,用Thread.currentThread()方法获得此线程的引用。

          从Runnable对象产生一个线程,并启动。必须new Thread(new RunnableThread()).start()。通过他调用run()方法。

         若开启线程只是为了驱动程序的某个部分,可用用内部类把线程有关的代码,隐藏在类的内部。

 

        super(true):设置线程为后台线程。

        原子操作:不能被中断的操作,原子操作只有对基本类型进行操作时,才被认为是安全的。其中long、double加上volatile才是原子操作。jvm中自增操作不是原子操作。

        Java中采用序列化访问共享资源解决共享资源问题,用关键字synchronized防止资源冲突。

        一个对象的所有synchronized方法,共享同一个锁。

        一个线程可以多次获得对象的锁。


        临界区:防止多个线程同时访问方法内部的部分代码,而不是访问整个方法。通过这种方式分离出来的代码段,称为临界区(同步控制块)。


        线程的四种状态:

                新建:线程已经建立,但还没有启动。

                就绪:任意时刻,线程可以运行也可以不运行(调度机制是否分配时间片给线程)。

                死亡:线程死亡的通常方式从run()返回。

                阻塞:线程可以运行,但有某个条件阻止它运行。

        进入阻塞状态:

                1.调用sleep()方法。

                2.调用wait()方法,直到线程得到notify()或notifyAll(),唤醒线程进入就绪状态。

                3.线程得等待某个输入输出完成。

                4.线程调用某个synchronized方法,但是对象未解锁。

         sleep()、wait()、notify()、notifyAll()方法解析:

                 1.调用sleep()方法,对象没有释放锁,sleep()是Thread的一部分。

                 2.wait()方法释放锁,可以通过notify()(notifyAll())唤醒,也可以设置参数,到期是自动唤醒。是基类Object的一部分。

                 3.只能在sychronized方法或对象中调用wait()、notify()、notifyAll()。否则,程序能通过编译,但是运行时会得到IllegalMonitorStateException异常。

        死锁:某个线程在等待另一个线程,而后者又在等待别的线程,这样一直下去,知道链条上的线程又在等待第一个线程释放锁(哲学家进餐问题)。

        停止线程:废弃stop()原因是因为他不释放线程的锁。为线程设置一个volatile类型的标志。

        中断阻塞线程 :Thread.interrupt()。

 

 

你可能感兴趣的:(java,JOIN,jvm,thread,object)