线程基础

2018-07-10  本文已影响0人  kindol

实现方式:

  1. 继承Thread类并且重写run()方法(必须)

    调用方式:new一个该已经继承Thread类的类后调用start()方法

    构造器的几种参数:

    • String name

      Thread的名称,默认为Thread-N(N是唯一的数字)

    • Runnable target

      runnable是thread要执行的指令列表。默认情况下,这是thread本身的run()这个method的消息。Thread class本身实现了Runnable接口。

    • Thread group

      默认情况下,thread会分配给予调用constructor的thread一样的thread group

    • Stack size

      每个thread都有一个method运行时保存临时变量的stack,stack大小由平台而定,不建议在可移植程序使用此变量

    Thread中,调用start后的执行流程为:start->start0->run->target.run

    观察其init函数,会发现其会获取当前运行线程为父线程,并使用父线程相关属性继承——daemon、priority、inheritableThreadLocal

  2. 实现Runnable接口并且重写run()方法(必须)

    调用方式:先new一个实现该接口的类a,再new一个Thread类并且将类a作为参数传入,调用start()方法执行产生线程执行

    注意:Runnable不是线程,而是线程运行的代码宿主

  1. 通过 Callable 和 Future 创建线程

    步骤:

    1. 创建 Callable 接口的实现类,并实现 call() 方法,该 call()方法将作为线程执行体,并且有返回值。
    2. 创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable对象(作为FutureTask的参数),FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。
    3. 使用FutureTask对象作为 Thread 对象的 target 创建并启动新线程
    4. 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

线程的状态:

阻塞分为三种:

sleep和wait的区别:

上下文切换:

实际上就是存储和恢复CPU状态的过程,线程切换需要记录程序计数器、CPU寄存器状态等数据,它使得线程执行能够从中断点恢复执行。

部分方法:

T2.jpg T3.jpg

currentThread():

返回代码段正在被哪个线程调用的信息。

sleep(...):

两个重载版本:

sleep(long millis)     //参数为毫秒
sleep(long millis,int nanoseconds)    //第一参数为毫秒,第二个参数为纳秒

调用sleep方法,如果此线程持有一对象的锁,其他线程也无法访问这个对象;sleep方法是让当前正在运行的线程休眠,也就是currentThread方法返回的对象

yield():

让当前线程交出CPU权限,跟sleep类似,不会释放对象锁,但是yield不能控制交出CPU的时间。另外,yield方法只能让拥有>=优先级的线程有获取CPU执行时间的机会

调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间。

sleep()和yield()的区别

  1. sleep切换其他线程不会考虑优先级,yield只会给相同优先级或更高优先级的线程以运行的机会。
  2. sleep后转入阻塞状态,yield后转入就绪状态
  3. sleep()抛出InterruptedException异常,yield无

对象方法:

停止线程:

停止线程是在多线程开发时很重要的技术点。可以使用Thread.stop()方法,但最好不用它,因为该方法是不安全的,已被弃用。有3种方法停止线程:

  1. run方法完成后线程终止

  2. stop

    stop和suspend(停止)及resume(继续)一样,都是作废过期的方法,使用他们可能产生不可预料的结果。suspend和resume方法会导致对公共同步对象的独占和由于暂停导致对数据的不同步。

    该方法将会抛出java.lang.ThreadDeath异常,不需要显示捕捉;使用此方法将会导致线程的清理工作得不到完成,而且会对对象进行解锁,可能导致数据不一致问题

  3. interrupt方法中断线程,但这个不会终止一个正在运行的线程,只是在当前线程打了一个停止的标记。需要加入一个判断才可以完成线程的停止

wait和notify概览

All2.jpg

参考:

http://www.importnew.com/21136.html
上一篇 下一篇

猜你喜欢

热点阅读