java 多线程之利用Thread类创建线程(Day02)

前言:在一个程序中,如果一次只完成一件事情,很容易实现,但现实生活中很多事情都是同时进行的,所以在java中为了模拟这种状态,引入了线程机制,简单的说,当程序同时完成很多事情时,就是所谓的多线程。

实现线程的两种方式:一是通过继承Thread类来创建线程,另一种方法就是通过实现runnable接口来创建线程

Runnable是最常用的用来实现线程的一个接口,是重点,但今天暂不做讲解,只是对基础的Thread类做个详解,Thread 是入门,需要掌握之后才能理解runnable 线程接口

Runnable 将另起博文,做详细讲解,稍后将发布Runnable创建线程的博文

一:多线程中几个相关的概念:

什么是并发?

一个软件同时有多个功能被同时执行,称之为并发;

什么是进程?

每一个独立执行的程序都称谓进程, 每个进程都可以同时包含多个线程。简单的说,进程就是一个独立执行的程序。

什么是线程:

程序中的每一个任务就是线程(通常每一个任务称为一个线程);

什么是多线程?

一个程序中同时执行多个任务,就叫做多线程,比如一个浏览器可以同时下载几张图片。这就是多线程

线程的特点

 1.进程它是资源分配的最小单位,线程是最小的执行单位。

2.一个进程可以有多个线程,

3.线程共享进程资源

二:实现线程的两种方式

方法一:通过继承Thread类创建线程;

利用Thread类创建线程的第一种方法

Thred类是本身是一个线程类,创建Thread对象通常使用这两种构造方法

1.public Thread(){}

2.public Thread(String name){}这个字符串参数就是一个自定义的线程名,也就是我们给线程起了一个名字,这个名字在查找线程的时候才能用到,我们暂时不通过这种方法创建线程对象。

Thread类有两个非常重要的方法,

1) run()方法,它是线程运行时执行的方法,也就是说我们这个线程打算要做什么事情,就要把要执行的内容代码写到这个run()方法里面

2)start()方法,它是使线程开始执行的方法,虽然我们执行的代码是写在上面run()方法里面的,但是我们需要使用这个start()方法才能够实现线程的并发效果。

Thread类还提供了一个静态方法sleep(long milli),这个方法是让执行的线程开始休眠,参数类型是毫秒。

例如:Thread.sleep(1000);表示线程运行的时候休眠一秒钟,就是运行时停顿了一秒。

如何通过继承Thread类来创建线程?

1)首先我们编写一个自定义的类,让他继承Thread类;

2)然后我们需要重写run方法,run()方法执行的代码就是我们这个线程要运行的代码;

3)在主方法(main)中创建线程类的对象,

4)通过我们创建的线程类的对象来调用start()方法启动线程。代码如下:

public class ThreadTest {

    public static void main(String[] args) {
        //创建线程对象,Threada是我自定义的子类;父类引用,指向子类对象。
        Thread a=new Threada();
        //要想我们的线程能够运行,则必须调用这个start()方法;
        a.start();//如果不调用start()方法,线程永远不会启动,在主方法没有调用start()方法之前,Thread对象只是一个实例,不是                       //真正的线程
    }

}
class Threada extends Thread{
    @Override
    //重写run()方法,我们线程要做什么事情,就把代码方法这个方法中来
    public void run() {

        for(int i=0;i<=100;i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);//表示线程运行的时候停顿一秒 
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

利用Thread 类创建线程的第二种方法

//利用Thread类创建线程的第二种方法
//因为Thread 类位于java.lang包中,因而程序的开头不用import导入任何包就可直接使用
// 使用public Thread(String ThreadName)构造方法创建线程
public class MyThread extends Thread {

    public MyThread() {

    }
    // 重写Thread 类中的run 方法
    @Override
    public void run() {
        for(int i=0;i<=20;i++) {
            System.out.println(i);
            try {
                //double值(1000*Math.random()
                //sleep返回值类型为long,long整型数据,数据基本整型、短整型都输与整型数据
                //但是Math.random返回一个浮点型数据,需要将其强制转换,转换成长整型、短整型或基本整型都可以
                sleep((int)(1000*Math.random()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String []args) {
        MyThread m=new MyThread();
        m.start();
        
    }
}

你可能感兴趣的:(java,Se)