zoukankan      html  css  js  c++  java
  • Java第九天

    创建线程的第一种方式:继承Thread类

    创建线程的第二种方式:实现Runnable接口

    1.定义类实现Runnable接口。

    2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。

    3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类中的构造函数的参数进行传递。

    为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。

    4.调用线程对象的start方法开启线程。

    实现Runnable接口的好处:

    1.将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象。

    2.避免了java单继承的局限性。

    线程安全问题产生的原因:

    1.多个线程在操作共享的数据

    2.操作共享数据的线程代码有多条

    当一个线程在执行操作共享数据的多条代码时,其他线程参与了运算。就会导致线程安全问题的产生。

    解决思路:

    就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不可以参与运算的。必须要当前线程把这些代码都执行完毕后,其他代码才可以参与运算。

    在java中,用同步代码块就可以解决这个问题。

    同步代码块的格式:

    synchronized(对象)

    {

      需要被同步的代码;

    }

    同步的好处:解决了线程的安全问题。

    同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁。

    同步的前提:同步中必须有多个线程并使用同一个锁。

    同步函数的锁是this

    同步函数和同步代码块的区别:

    同步函数的锁是固定的this,同步代码块的锁是任意的对象。建议使用同步代码块。

    静态的同步函数使用的锁是该函数所属的字节码文件对象。可以用getClass方法获取,也可以用 当前类名.class表示。

     1 死锁
     2 class DeadLock 
     3 {
     4     public static void main(String[] args) 
     5     {
     6         Test a=new Test(true);
     7         Test b=new Test(false);
     8         Thread t1=new Thread(a);
     9         Thread t2=new Thread(b);
    10         t1.start();
    11         t2.start();
    12     }
    13 }
    14 
    15 
    16 class Test implements Runnable
    17 {
    18     private final boolean flag;
    19     public Test(boolean flag)
    20     {
    21         this.flag=flag;
    22     }
    23     public void run()
    24     {
    25         if(flag)
    26         {
    27             while(true)
    28             {
    29                 synchronized(MyLock.locka)
    30                 {
    31                     System.out.println(Thread.currentThread().getName()+"-----if----locka");
    32                     synchronized(MyLock.lockb)
    33                     {
    34                         System.out.println(Thread.currentThread().getName()+"-----if----lockb");
    35                     }
    36                 }
    37             }
    38         }
    39         else
    40         {
    41             while(true)
    42             {
    43                 synchronized(MyLock.lockb)
    44                 {
    45                     System.out.println(Thread.currentThread().getName()+"-----else----lockb");
    46                     synchronized(MyLock.locka)
    47                     {
    48                         System.out.println(Thread.currentThread().getName()+"-----else----locka");
    49                     }
    50                 }
    51             }
    52         }
    53 
    54     }
    55 }
    56 
    57 
    58 
    59 
    60 
    61 class MyLock
    62 {
    63     public static final Object locka=new Object();
    64     public static final Object lockb=new Object();
    65 }
  • 相关阅读:
    java 获取某个URL的文件扩展名的方法(非精确,精确的扩展名应该使用服务器返回的MIME-TYPE)
    导出Redis某个列表所有数据的语句
    CDH的几个包的下载地址
    使用visualVM 1.3.8(visualvm_138-ml.zip) 监控远程Tomcat运行情况
    ubuntu 16.04下安装oracle jdk 1.7
    迅雷影音下载的在线字幕在哪里?
    【Android开发】之Android环境搭建及HelloWorld
    Android开发环境搭建篇详尽的教程实例汇
    【Android开发】Api_Android_Distribute
    Eclipse_Configure
  • 原文地址:https://www.cnblogs.com/pushudepu/p/6021370.html
Copyright © 2011-2022 走看看