美文网首页
java多线程

java多线程

作者: 橘子面包 | 来源:发表于2018-08-08 16:05 被阅读0次

    参考文章

    如何创建并运行java线程 | 并发编程网 – ifeve.com

    (此文摘取了其中一些知识点,具体知识点及源码请于链接处观看)

    创建并运行java线程

    1.创建Thread的子类

    注意

    一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。

    2.实现Runnable接口

    为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象。示例如下:

    Thread thread = new Thread(new MyRunnable());

    thread.start();

    3.创建子类还是实现Runnable接口?

    线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些

    4.常见错误:调用run()方法而非start()方法

    事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。

    5.获取线程名

    Thread子类:调用getName()

    Runnable的实现类

    线程安全与共享资源

    允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。

    1.局部变量和对象

    局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享

    2.局部对象的引用

    所有的对象都存在共享堆中。如果在某个方法中创建的对象不会逃逸出(译者注:即该对象不会被其它方法获得,也不会被非局部变量引用到)该方法,那么它就是线程安全的。实际上,哪怕将这个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程安全的。

    public void someMethod(){

      LocalObject localObject = new LocalObject();

      localObject.callMethod();

      method2(localObject);

    }

    public void method2(LocalObject localObject){

      localObject.setValue("value");

    }

    样例中LocalObject对象没有被方法返回,也没有被传递给someMethod()方法外的对象。每个执行someMethod()的线程都会创建自己的LocalObject对象,并赋值给localObject引用。因此,这里的LocalObject是线程安全的。事实上,整个someMethod()都是线程安全的。即使将LocalObject作为参数传给同一个类的其它方法或其它类的方法时,它仍然是线程安全的。当然,如果LocalObject通过某些方法被传给了别的线程,那它就不再是线程安全的了。

    线程控制逃逸规则

    如果一个资源的创建,使用,销毁都在同一个线程内完成,

    且永远不会脱离该线程的控制,则该资源的使用就是线程安全的。

    资源可以是对象,数组,文件,数据库连接,套接字等等。Java中你无需主动销毁对象,所以“销毁”指不再有引用指向对象。

    即使对象本身线程安全,但如果该对象中包含其他资源(文件,数据库连接),整个应用也许就不再是线程安全的了。比如2个线程都创建了各自的数据库连接,每个连接自身是线程安全的,但它们所连接到的同一个数据库也许不是线程安全的。比如,2个线程执行如下代码:

        检查记录X是否存在,如果不存在,插入X

    如果两个线程同时执行,而且碰巧检查的是同一个记录,那么两个线程最终可能都插入了记录:

    线程1检查记录X是否存在。检查结果:不存在

    线程2检查记录X是否存在。检查结果:不存在

    线程1插入记录X

    线程2插入记录X

    相关文章

      网友评论

          本文标题:java多线程

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