黑马程序员_多线程

来源:互联网 发布:php 文章内链 编辑:程序博客网 时间:2024/05/24 05:44

android培训、java培训、期待与您交流!


 

进程:正在执行中的程序(准确来说是:程序的执行)

每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。

每个进程对应一个PCB(Process Control Block),这是进程存在的标志。

 

线程:线程是进程中一个独立的控制单元,控制着进程的执行。

每个线程对应一个TCB(Thread Control Block)。

一个进程至少对应一个线程。

 

--------------------------------------------------------------------------------------------------

 

一、如何在自己的代码中自定义一个线程?

 

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

1.定义类继承Thread类

2.复写Thread类中的run()方法,将自定义的代码存储在run()中,让其运行。

3.调用线程的start方法:启动线程;调用run方法

 

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

1.定义类实现Runnable接口

2.覆盖Runnable接口中的run方法

  ***将线程要运行的内容存放在run方法中。

3.通过Thread类建立线程对象。

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

  ***原因:

  ***自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去执行指定    对象的run方法。

5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

 

******实现方式和继承方式有什么区别的?

******1.实现方式的好处:避免了单继承的局限性。定义线程时,建议使用实现方式。

******2.继承Thread:线程代码存放在Thread子类run方法中;实现Runnable:存放在接口子类的run方法中.

 

注意:start会开启线程,如果不使用,线程只是创建并未开启,run方法的调用和一般用法无异。

 

--------------------------------------------------------------------------------------------------

多线程的安全问题:

 

出现的原因:

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,

另一个线程参与进来执行,会导致共享数据的错误。

 

Java对于多线程的安全问题的解决方式:同步代码块(临界区代码)

 

synchronized(对象)

{

       需要被同步的代码;

}

对象如同锁。持有锁的线程可以在同步中执行。没有持有锁的线程,即使获取了执行权,也无法进入。

 

同步的前提:

1.必须要有两个或者两个以上的线程。

2.必须是多个线程使用同一个锁。

3.只能有一个线程在执行状态。

 

* /

--------------------------------------------------------------------------------------------------

/ *

--------------------------------------------------------------------------------------------------

需求:银行有一个金库。

三个储户分别存300元,每次存100,存3次。

 

练习目的:该程序的安全问题解决

分析:

1.明确哪些代码是多线程运行代码

2.明确共享数据

3.明确多线程运行代码中哪些语句是操作共享数据的。

 

class Bank

{

       private int sum;

       public void add(int x){

              sum = sum + x;

              System.out.println("sum=:"+sum);

       }

}

 

class Customer implements Runnable

{

       Bank b = new Bank();

       Object obj = newObject();

       public void run(){

              for (int time=0;time<3 ;time++ ){

                    synchronized(obj)

                     {

                                            System.out.println(Thread.currentThread().getName()+"..."+time+":"+"100");

                           b.add(100);

                     }

              }

       }

     

}

class ThreadDemo

{

       public static void main(String[] args)

       {

              Customer ctm=new Customer();

 

              Thread t1 = newThread(ctm);

              Thread t2 = newThread(ctm);

              Thread t3 = newThread(ctm);

              t1.start();

              t2.start();

              t3.start();

       }

}

 

 

【回顾】同步与单例设计模式:

 

懒汉式:

class Single

{

       public static Single s= null;

       private Single(){};

       public static SinglegetInstance(){  //如果直接定义成同步函数,判断次数过多,效率低

              if(s ==null){  //使得后续使用该对象过程中,不再进行synchronized判断,提高效率

                    

                    synchronized(Single.class){

                           if(s == null){

                                  s = new Single();

                            }

                     }

              }

              return s;

       }

}

--------------------------------------------------------------------------------------------------

 

同步会产生的矛盾:死锁。

 

死锁的产生:同步嵌套同步。

 

package com.itheima.test7;

 

class Test implements Runnable{

    private boolean flag;

    Test(boolean flag){

       this.flag=flag;

    }

    public void run(){

      

           if(flag){

              synchronized (MyLock.locka) {

                  System.out.println("iflocka");

                  synchronized (MyLock.lockb) {

                     System.out.println("if lockb");

                  }

              }

             

              }

           else{

                      synchronized (MyLock.lockb) {

                         System.out.println("else lockb");

                  synchronized (MyLock.locka) {

                     System.out.println("else locka");

                  }

              }

             

           }

       }

      

    }

class MyLock{

  static   Objectlocka=new Object();

  static   Objectlockb=new Object();

}

 

public class DeadLockTest {

  public static void main(String[] args) {

   

      Thread t1=new Thread(new Test(true));

      Thread t2=new Thread(new Test(false));

      t1.start();

      t2.start();

}

}

 


0 0
原创粉丝点击