java多线程学习(一)之创建线程的两种方式

来源:互联网 发布:梦里花落知多少小说 编辑:程序博客网 时间:2024/04/25 19:10

1、首先来了解一下线程和进程的概念

   进程的概念:
   进程是操作系统资源管理的最小单位,进程是一个动态的实体,他是程序的一次执行过程。也叫作一个控制单元
   线程的概念:
   线程是进程中独立的控制单元,线程控制着进程的执行。一个进程中至少有一个线程。

   java VM(java虚拟机)在运行时启动了一个进程---java.exe
   该进程在执行时,至少有一个线程在控制着java程序的运行,并且这个线程存在于java的main函数中,
   该线程称之为java的主线程。

   扩展:在JVM运行时,除了main函数中的线程在运行外,还有JVM中负责java垃圾回收的线程在运行。因此,java不是单线程运行程序。

实现多线程的第一种方式(单继承方式):

1.继承自Thread类实现多线程
     步骤:1)创建一个类继承Thread
                2)覆写run方法

                     目的是存放多线程要执行的自定义代码。

                3)在main函数中创建该类
                4)使用start()方法调用该线程(start方法有两种含义:1,启动多线程。2,调用线程中的run方法)

public class Day1{ public static void main(String args[]){    DemoThread dt = new DemoThread();    dt.start();  //用于启动线程,并自动执行run方法。    dt.run(); //只是单纯的对象调用,在主线程中执行,并不开启子线程。    for(int i=0;i<50;i++){      System.out.println("main run-----"+i);    } }}class DemoThread extends Thread{  public void run(){    for(int i=0;i<50;i++)      System.out.println("demo run-----"+i);    }}
我们发现运行同一个程序,他们的运行结果却不太相同,
这是多个线程都获取系统的CPU资源,CPU执行到谁,谁就运行。
CPU在某一时刻只能执行一个程序(多核除外),CPU在做着快速的切换,以达到看上去是在同时执行的效果。
我们通过打印输出,来判断到底是哪一个线程抢占到了CPU的资源。

Thread类的意义-----用于描述线程。
该类定义了一个功能,用于存储线程要运行的代码,而这个存储功能就是run方法。
run方法中存储线程要执行的 自定义代码块。
而start方法用于启动线程,并自动执行run方法。

Thread类中提供的常用的方法:

static Thread currentThread: 返回当前正在执行的线程对象的引用

String getName();返回当前线程的名称。

当使用Thread的无参构造创建线程实例时,java虚拟机会自动为线程创建一个名字。(以Thread-编号的格式)

static void sleep(long time)  使线程休眠time时间。

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

实现Runnable 接口来实现多线程:
步骤:
  1)创建类实现Runnable接口
  2)实现Runnable接口中的run方法
  3)创建Thread对象
  4)将Runnable对象作为实际参数传递给Thread的构造方法
  5)调用Thread类的start方法,自动执行Runnable对象中的run方法

public class Day1Runable{ public static void main(String args[]){    DemoRunnable dr = new DemoRunnable();    Thread t1 = new Thread(dr);    Thread t2 = new Thread(dr);    Thread t3 = new Thread(dr);    Thread t4 = new Thread(dr);    t1.start();    t2.start();    t3.start();    t4.start(); }}class DemoRunnable implements Runnable{  private int ticket=100;  public void run(){    while(true){      if(ticket>0)        System.out.println(Thread.currentThread().getName()+"--售票:"+ticket--);      }    }}

问题:继承方式与实现方式有什么区别
  1、避免了单继承的局限性
  2、多线程执行代码位置不同:
    继承Thread类:代码存放在Thread类的run方法中
    实现Runnable类:代码存放在Runnable接口的run方法中。




0 0