黑马程序员—9—Java基础:有关多线程的学习笔记和学习心得体会

时间:2023-02-20 10:46:11
  ------- <ahref="http://www.itheima.com" target="blank">android 培训 </a> <ahref="http://www.itheima.com" target="blank">java 培训 </a> 、期待与您交流! ----------

1.      进程与线程简介

a)        进程:一般来说就是正在进行中的程序;每一个进程执行都有一个执行顺序,该顺序是执行路径,或者叫做一个控制单元。

b)       线程:就是进程中的一个控制单元,线程在控制着进程的执行。同时一个进程至少有一个线程。

c)       Java vm 启动的时候会有一个进程Java.exe  该进程中至少一个线程负责Java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。

扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负者垃圾回收机制的线程。

d)       多线程意义:可以让程序看上去是同时执行,提高效率。

2.      如何在自己的代码中,自定义一个线程呢?

通过对api中Java.lang的Thread查找,Java已经提供了对线程这类事物的描述,就是Thread类。

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

步骤:

1.      定义类继承Thread。

2.      复写Thread类中的run方法

      目的:将自定义代码存储在run方法,让线程运行。

3.      调用线程的start方法,该方法有两个作用,启动线程,调用run方法。

(多线程那个的一个特性,随机性,谁抢到谁执行,至于执行多长,cpu说的算。)

例子:

class Demo extends Thread

{

    public void run()

    {

        System.out.println("demorun");

    }

}

public class ThreadDemo

{

 

   

    public static void main(String[] args)

    {

        Demo d = new Demo();//创建一个线程

        d.start();//开启线程并执行该线程run方法

        //d.run();//仅仅是对象调用方法,而线程创建了,但并没运行。

    }

 

}

问什么要覆盖run方法?

Thread类用于描述线程。该类就定义了一个功能,用于存储线程的代码,该存储功能就是run方法,也就是说Thread类中的run方法,用于存储线程要运行的代码。

3. 如何获取线程名称?

原来线程都有自己默认的名称,Thread—编号该编号从0开始。可以用getname()方法获取如:System.out.println(this.getname()) ;//this==Thread.currentThread() 但是获取的是自己命名的线程;命名 Test t == new Test(“xiancheng1”);父类里面有name变量,可以直接传名。

4. 几个线程的小方法

     static ThreadcurrentThread():获取当前线程对象

     getName();获取线程名称。

     设置线程名称:setName或者构造函数。

5. 例子:用第一种创建线程的方法实现买票程序:但票必须静态,

/*

需求:简单的买票程序。

多个窗口买票。

 

*/

class Ticket extendsThread

{

    private static int tick = 100;

    public void run()

    {

        while(true)

        {

            if(tick>0)

            {

                System.out.println(Thread.currentThread().getName()+"sale: "+ tick--);

            }

        }

    }

}

class  TickDemo

{

    public static void main(String[] args)

    {

        Ticket t1 = new Ticker();//这样买啦400张票,可以把票定义为静态解决。private static int tick = 100;

        Ticket t2 = new Ticker();

        Ticket t3 = new Ticker();

        Ticket t4 = new Ticker();

        t1.start();

        t2.start();

        t3.start();

        t4.start();

        //System.out.println("Hello World!");

    }

}

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

  步骤:

1.     定义类实现Runnable接口

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

将线程需要运行的代码存放在该run方法中

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

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

为什么要将Runnable接口的子类对象传递给Thread的构造函数?

因为,自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去指定对象的run方法。就必须明确该run方法的所属对象。

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

例子:买票,

/*

需求:简单的买票程序。

多个窗口买票。

 

*/

class Ticketimplements Runnable//extends Thread

{

  private static int tick = 100;

  public void run()

  {

      while(true)

      {

          if(tick>0)

          {

              System.out.println(Thread.currentThread().getName()+"sale: "+ tick--);

          }

      }

  }

}

class 

{

  public static void main(String[] args)

  {

      Ticker t = new Ticket();

      Thread t1 = new Thread(t);

      Thread t2 = new Thread(t);

      Thread t3 = new Thread(t);

      Thread t4 = new Thread(t);

      t1.start();

      t2.start();

      t3.start();

      t4.start();

     

  }

}

7. 学习心得和体会:

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

实现方式好处:避免了但继承的局限性。

在定义线程时,建立使用实现方式。

继承Thread:线程代码存放Thread子类run方法中。

实现Runnable,线程代码存放在接口的子类的run方法中。

  ------- <ahref="http://www.itheima.com" target="blank">android培训</a><ahref="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------