二、多线程的

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接口的方式要通用一些。