java多线程

  1. 1. 1.1 进程和线程
  2. 2. 1.2 实现线程的方式
    1. 2.1. 构造方法摘要
    2. 2.2. 创建一个新的执行线程有两种方法 :
    3. 2.3. 1.2.1 继承Thread类
    4. 2.4. 1.2.2 实现Runnable接口(优先使用)

1.1 进程和线程

​ 进程process:每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销,一个进程包含1-n个线程。可以把进程简单理解为操作系统中运行的一个程序

​ 线程thread:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

​ 多进程是指操作系统能同时运行多个任务(程序)。

​ 多线程是指在同一个程序中多个顺序流在执行,进程是线程的容器,一个进程里可以运行1-N个线程,操作系统以进程为单位分配资源。

线程是进程的一个执行分支。

1.2 实现线程的方式

​ 创建线程就是创建Thread类(子类)的对象(实例)

​ java.lang.Thread

  • public class Thread extends Object implements Runnable

构造方法摘要

Constructor and Description
Thread() : 分配一个新的 Thread对象。
Thread(Runnable target) : 分配一个新的 Thread对象。

创建一个新的执行线程有两种方法 :

1.2.1 继承Thread类

  1. 一个是将一个类声明为Thread的子类。 这个子类应该重写run类的方法Thread 。 然后可以分配并启动子类的实例。 例如,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ThreadTest extends Thread {

@Override
public void run() {
System.out.println("这个线程开始运行...");
}
}

public class Test {
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();
tt.start(); // 启动一个线程
}
}

注意:主函数使用start方法启动新线程,而不是调用run方法

1.2.2 实现Runnable接口(优先使用)

  1. 另一种方法来创建一个线程是声明实现类Runnable接口。 那个类然后实现了run方法。 然后可以分配类的实例,在创建 Thread 时作为参数传递,并启动。
1
2
3
4
5
6
7
8
9
10
11
12
class ThreadTest implements Runnable{
public void run(){
System.out.println("这个线程开始运行");
}
}
public class Test {
public static void main(String[] args) {
ThreadTest tt = new ThreadTest ();
Thread t = new Thread(tt);
t.start(); //通过一个线程对象启动它
}
}

这两种方式的区别:

1、继承Thread类:编写简单,可直接操作线程。适用于单继承

2、实现Runnable接口:避免单继承局限性,便于共享资源。

推荐使用实现Runnable接口方式创建线程

思考:为什么不直接调用run()方法?

​ 不管调用什么方法,如何调用,都是只有主线程一条执行路径。