二、多线程的
2.1 程序
程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件,比如:我们要启动酷狗听音乐,则对应酷狗的可执行程序。当我们双击酷狗,则加载程序到内存中,开始执行该程序,于是产生了“进程”。
2.2 进程
行中的程序叫做进程(Process),是一个动态的概念。现代的操作系统都可以同时启动多个进程。比如:我们在用酷狗听音乐,也可以使用eclipse写代码,也可以同时用浏览器查看网页。
2.3 线程
一个进程可以产生多个线程。同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据),所以线程又被称为轻量级进程(lightweight process)。
2.4 进程和线程的区别
线程和进程最根本的区别在于:进程是资源分配的单位,线程是调度和执行的单位。
线程是进程的一部分,所以线程有的时候被称为轻量级进程
一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
Java中如何实现多线程
方式一
继承Thread类:
1.在Java中负责实现线程功能的类是java.lang.Thread 类。
2.可以通过创建 Thread的实例来创建新的线程。
3.每个线程都是通过某个特定的Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
4.通过调用Thread类的start()方法来启动一个线程。
【示例】通过继承Thread类实现多线程
public class DemoThread01 extends Thread{
@Override
public void run(){
for(int i = 0; i < 100; i++) {
System.out.println("乌龟赛跑哦"+ this.getName());
}
}
public static void main(String[] args) {
DemoThread01 demoThread01 = new DemoThread01();
demoThread01.start();
DemoThread01 demoThread02 = new DemoThread01();
demoThread02.start();
for (int i = 0; i < 100; i++) {
System.out.println("兔子赛跑");
}
}
}
兔子赛跑
兔子赛跑
乌龟赛跑哦Thread-1
兔子赛跑
兔子赛跑
乌龟赛跑哦Thread-0
乌龟赛跑哦Thread-0
乌龟赛跑哦Thread-0
乌龟赛跑哦Thread-0
乌龟赛跑哦Thread-1
乌龟赛跑哦Thread-1
乌龟赛跑哦Thread-1
乌龟赛跑哦Thread-1
此种方式的缺点:
如果我们的类已经继承了一个类(如小程序必须继承自 Applet 类),则无法再继承 Thread 类。
方式二 通过Runnable接口实现多线程。
1.实现Runnable接口
2.复写run方法
3.创建子类对象,
4.创建Thread对象
5.将子类对象传入Thread对象中
6.Thread类对象调用start方法,开启多线程。
【示例】通过Runnable接口实现多线程
public class DemoRunnable01 implements Runnable {
public static void main(String[] args) {
DemoRunnable01 demoRunnable01 = new DemoRunnable01();
Thread thread = new Thread(demoRunnable01);
Thread thread1 = new Thread(demoRunnable01);
Thread thread2 = new Thread(demoRunnable01);
thread.start();
thread1.start();
thread2.start();
for(int i = 0; i < 1000; i++){
System.out.println("兔子在跑步");
}
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("乌龟来了"+ Thread.currentThread().getName());
}
}
}
乌龟来了Thread-1
乌龟来了Thread-1
乌龟来了Thread-1
乌龟来了Thread-1
乌龟来了Thread-0
乌龟来了Thread-0
乌龟来了Thread-0
乌龟来了Thread-2
乌龟来了Thread-2
乌龟来了Thread-2
乌龟来了Thread-2
乌龟来了Thread-1
乌龟来了Thread-1
乌龟来了Thread-1
此种方式的优点: 避免了继承Thread类的缺点,即实现Runnable接口的同时还可以继承某个类,所以实现Runnable接口的方式要通用一些。