java多线程

来源:互联网 发布:c语言中的volatile 编辑:程序博客网 时间:2024/04/30 08:45

 

                      多线程学习
1.  多线程的概论
       想要了解多线程先就了解进程与线程之间的关系
       1.进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。
       2线程:就是一个进程中负责一个执行路径。
总结   1.一个进程是包含多个线程的
       2.多线程就是一个进程中多个执行路径同时执行。
2. java中多线程的创建方式  
 第一种:某个类继承Threadfd 

pubic class ThreadDemo extends Thread{
   //自己的成员变量
    public void run(){       //必须要复写run()方法
      //里面写要进行的操作  可以是方法  代码块 
    }
     public static void main(String[] args) {       ThreadDemo threadDemo=new ThreadDemo();ThreadDemo threadDemo1=new ThreadDemo();threadDemo.start();     //一定要通过start启动线程        threadDemo1.start();
}
     
      第二种:就是某个类实现Runnable接口    
               
public class ThreadRun implements Runnable {@Overridepublic void run() {   //重写接口中的run()方法           }}
public class ThreadDemo1 {public static void main(String[] args) {ThreadRun threadRun=new ThreadRun();Thread thread1=new Thread(threadRun,"j");Thread thread2=new Thread(threadRun,"h");Thread thread3=new Thread(threadRun,"j");Thread thread4=new Thread(threadRun,"j");Thread thread=new Thread(threadRun, "s");thread1.start();thread2.start();thread3.start();thread4.start();}}
 总结:
         1.线程的启动使用父类的start()方法
         2.如果线程对象直接调用run();jvm不会当做线程来处理,会认为是不同的方法
         3.线程的启动只能有一次,否则会抛出异常
         4.可以直接创建Thread类的对象并启动该线程,如果没有重写run()什么也不执行 

         5:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中

         6:通过Thread类建立线程对象

         7:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法      

         8:调用Thread类的start方法开启线程,并调用Runable接口子类run方法



3.常见的线程方法

         Thread(String name)     初始化线程的名字
         getName()             返回线程的名字
        setName(String name)    设置线程对象名
        sleep()                 线程睡眠指定的毫秒数。
        getPriority()             返回当前线程对象的优先级   默认线程的优先级是5
        setPriority(int newPriority) 设置线程的优先级    虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10 ,最小的1 , 默认是5)。
        currentThread()      返回CPU正在执行的线程的对象

4.锁对象

          每个java对象都有一把锁对象,并且只有一把钥匙

      java中的每个对象都有一个内置锁,只有当对象具有同步方法代码块是,内置锁才会起作用,当一个同步的非静态方法时,就会自动获取与类的当前的实例(this)相关的锁,该类的代码就是正在执行的代码块。获得一个对象的锁也成为获取说教,锁定对象也可以称之为监视器来指定我们正在获取的锁对象。
      因为一个对象之一一个锁,所以如果一个线程获取了这个锁,其他的线程就不能获得了,直到只个 线程释放(或者返回)锁。也就是说在锁释放之前,任何其他的线程都不能进入同步代码(不可以进入该对象的任何同步方法)。释放锁指的是持有该锁的线程退出同步方法,此时其他的线程可以进入该对象的同步的方法。
         synchronized修饰方法,相当于synchronized(this)
注意:要想达到同步效果,对所有调用此方法的线程而言,必须保证this的唯一性,
否则不要用同步方法,请使用synchronized代码块,并保证同步锁的唯一性

5.死锁

                                      java 中的同步机制解决了线程安全问题,但是也同时引发 了死锁现象

  死锁现象出现的根本原因: 1.存在两个或者两个以上的线程
                                                    2.存在两个或者两个以上的共享资源
                                                    3.需求发生了冲突
       本人解释:比如我和室友在寝室,然后室友在上厕所没有带纸,突然我也要上厕所了,我就要室友出来,我去上厕所,但是室友说你给我纸我就出来,我却说你出来我就给你纸。出现这种情况就尴尬了,这样就陷入了死锁状态。
代码:
public class DeadLock implements Runnable {private String name;public DeadLock() {}public DeadLock(String name) {this.name = name;}@Overridepublic void run() {while (true) {if ("张三".equals(name)) {System.out.println("张三要获取遥控器");synchronized ("遥控器") {System.out.println("张三要获取电池");synchronized ("电池") {System.out.println("张三获取了遥控器和电池,打开了空调,真舒服!");}}} else {System.out.println("李四要获取电池");synchronized ("电池") {System.out.println("李四要获取遥控器");synchronized ("遥控器") {System.out.println("李四获取了遥控器和电池,打开了空调,真舒服!");}}}}}}
public class DeadLockTest {<span style="white-space:pre"></span>public static void main(String[] args) {<span style="white-space:pre"></span>Thread zs = new Thread(new DeadLock("张三")," 张三");<span style="white-space:pre"></span>Thread ls = new Thread(new DeadLock("李四")," 李四");<span style="white-space:pre"></span>zs.start();<span style="white-space:pre"></span>ls.start();<span style="white-space:pre"></span>}}
   因为发生了死锁现象之后是无解的 ,所以我们要避免死锁
                 1.尽量不要锁多个资源,在完成一项任务。
                  2.尽量不要交叉锁定资源        


0 0