前言:在一个程序中,如果一次只完成一件事情,很容易实现,但现实生活中很多事情都是同时进行的,所以在java中为了模拟这种状态,引入了线程机制,简单的说,当程序同时完成很多事情时,就是所谓的多线程。
一个软件同时有多个功能被同时执行,称之为并发;
什么是进程?
每一个独立执行的程序都称谓进程, 每个进程都可以同时包含多个线程。简单的说,进程就是一个独立执行的程序。
什么是线程:
程序中的每一个任务就是线程(通常每一个任务称为一个线程);
什么是多线程?
一个程序中同时执行多个任务,就叫做多线程,比如一个浏览器可以同时下载几张图片。这就是多线程
线程的特点
1.进程它是资源分配的最小单位,线程是最小的执行单位。
2.一个进程可以有多个线程,
3.线程共享进程资源
利用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();
}
}