zoukankan      html  css  js  c++  java
  • Java多线程总结

    http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html

    1.如果一个类继承了Thread的话,不适合资源共享;但是如果实现了Runnable接口的话,很容易的实现资源共享。

    2.实现Runnable接口所具有的优势:第一,适合很多相同程序代码的线程去处理同一资源;第二,可以避免了Java中单继承的限制;第三,代码可以被多个线程共享,代码和数据独立,实现了程序的健壮性。

    3.main方法也是一个线程,在java中,所有线程都是同时启动的,至于哪个先执行,完全看谁先得到CPU的资源。

    4.在java中,每当程序启动运行的时候,至少会启动两个线程,一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM。(每一个JVM运行,其实就是在操作系统中启动了一个进程)。

    5.主线程也有可能在子线程结束之前结束,并且子线程不会因为主线程的结束而结束,它不受主线程的影响。这句话中的主线程可以理解为main里面的代码。子线程可以理解为继承了Thread的类或者实现了Runnable接口的类的.start()方法。

    6.Thread.sleep(2000);线程休眠2000毫秒,也就是每隔2秒输出一个object。thread.interrupt()方法,用来中断线程。thread.setPriority()用于设置线程的优先级(本质还是谁先得到cpu的资源,谁先执行)。其中thread是Thread类的对象。

    7.thread.yield()方法,线程的礼让。先让其他线程执行。

    8.使用线程解决同步问题,有两种方法。第一,使用同步代码块(synchronized)。第二,使用同步方法。当多个线程共享资源的时候,要用到同步,但是过多的同步则会带来死锁的问题。

     http://lavasoft.blog.51cto.com/62575/27069/

    1.每个进程会有自己的一片独立的内存空间,多个线程来共享对应的进程的内存。在windows中一个.exe就是一个进程。

    2.一个Java程序总是从main()方法开始执行,main()即是主线程。在主线程执行过程中,每产生一个新的线程,就产生一个新的调用栈(在Java中,每个线程都有一个调用栈)。。。。垃圾回收机制,也就是守候线程,此类线程专为后台服务,无需显示关闭,当所有用户线程运行结束,守候线程自动关闭。只要有线程执行,守护线程就不会关闭。

    3.在main方法中,实例化线程的方法:如果是扩展了java.lang.Thread类的,直接使用new即可。。。如果是实现了java.lang.

    Runnable接口的方法,则要通过实现Thread的构造方法来实例化线程。

    Thread(Runnable target);

    Thread(Runnable target,String name);这是Thread的构造方法其中的两个。

    4.线程的启动:调用.start()方法,然后发生了一系列复杂的事情:第一,启动新的执行线程(具有新的调用栈);第二,该线程从新状态(是指,调用.start()方法的时候,线程只有一个Thread类的对象,处于新状态,还没有成为一个真正的线程)转移到可运行状态;第三,当线程获得机会执行时,其目标run()方法将要执行。对于Java来说,run()方法同main()方法一样,没有什么特别之处,它只是知道了新线程调用的方法名称。

    5.线程的名字问题:第一,虚拟机自己给定的名字(不确定);第二,自己定义的名字。在没有指定线程名字的情况下,虚拟机会自动指定线程的名字,并且主线程的名字是main。获取当前线程的方法是:Thread.currentThread().使用方法是将System.out.println(Thread.currentThread().getName());放置在所写的进程类中,会打印输出由JVM指定的进程名字。

    6.线程的调度是JVM的一部分,一个机器上拥有一个CPU的话,一次只能运行一个线程。

    7.线程栈的概念。线程栈是指某时刻内存中线程调用的栈信息,当前调用的方法总是位于栈顶。线程栈的内容是随着程序的运行动态而变化的,因此研究线程栈必须选择一个运行时刻。当启动一个新线程的时候,又会重新又一个栈,这样两个线程就会并行来运行的。之前的一个栈存放的是main、Thread对象两个(它们是主线程),之后的一个存放的是run()(他们是子线程).

    8.线程的几个状态:第一,新状态:线程对象已经创建,但还没有在其上调用start()方法。第二,可运行状态,即JVM一旦调度就可以运行的。其一,调用了.start()方法后,线程进入可运行状态;其二,线程从阻塞、等待、睡眠状态转回来之后,也变成了可运行状态。第三,运行状态,JVM的调度程序从可运行池(其实,是一个线程队列)中选择一个线程,让它进入运行状态。这也是线程进入运行状态的唯一一种方式。第四,三种状态(等待、阻塞、睡眠状态):这三种进程的状态仍旧是活的,但是当前没有条件运行,只差JVM调度执行。第五,死亡状态,其一,如果在死亡的线程上调用.start()方法,会抛出java.lang.IllegalThreadStateException异常。其二,线程一旦死亡,不能复生。其三,当线程的run()方法完成时,就认为它死去,这个线程对象也许是活的,但是,他已经不是一个可以单独执行的线程。

    9.阻止线程执行的几种状况:IO阻塞情况、睡眠、等待、需要一个对象的锁定而被阻塞。

    10.睡眠:Thread.sleep(long millis)和Thread.sleep(long mills, int nanos)静态方法(mills毫秒+nanos纳秒),强制线程休眠。为什么要引入睡眠机制呢?当线程执行太快,或者是需要强制线程进入下一轮的时候,启用线程。休眠了当前的线程,其他线程就有机会去执行了。

    11.让路:线程的优先级和线程的让步。线程的让步:Thread.yield()来实现的,达到的效果:暂停当前正在执行的线程对象,并执行其他线程。线程的优先级:JVM的线程调度机制是基于优先级的抢先调度机制。

  • 相关阅读:
    Ubuntu16.04编译Android6.0/cm13.0教程及相关错误解决办法
    TWRP基于omnirom 6.0.1编译教程
    教你一招:解决Win 10安装软件时提示:文件系统错误 (-1073740940)
    红米3 TWRP-3.0.2(android_6.0.1_r72分支)中文版Recovery更新于20161018
    C# Note32: 查漏补缺
    postgreSQL使用杂谈
    Granfana+PostgreSQL
    WIndows下使用Grafana+InfluxDB打造监控系统
    【译】历史上的名人如何利用不同的思维方式成就自己
    【译】Focused and Diffuse Modes(专注与发散模式)
  • 原文地址:https://www.cnblogs.com/RunForLove/p/4202262.html
Copyright © 2011-2022 走看看