Java多线程:创建和启动

创建线程


Java中创建线程有两种方法:

  1. 扩展java.lang.Thread

  2. 实现java.lang.Runnable接口

扩展java.lang.Thread类

这个类中有一个run()方法,子类只需要重写该方法即可。

1
public void run()

实现java.lang.Runnable接口

实现这个接口的类需要实现run方法,同上

启动线程


在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

在调用start()方法之前:线程处于新状态中,新状态指向一个Thread对象,但还没有一个真正的线程。

在调用start()方法之后:发生了一系列复杂的事情:

  1. 启动新的执行线程(具有新的调用栈)

  2. 该线程从新状态转移到可运行状态

  3. 当该线程获得机会执行时,其目标run()方法将运行

注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。若在main主线程中直接调用run方法,那么将会阻塞主线程,直到run方法执行完毕。

例子


继承Thread类,重写run方法,并调用start方法启动线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Thread2Methods extends Thread {
public Thread2Methods(String name) {
super(name);
}
@Override
public void run(){
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(i*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread2Methods thread1 = new Thread2Methods("线程1");
Thread2Methods thread2 = new Thread2Methods("线程2");
thread1.start();
thread2.start();
}
}

实现Runnable接口,重写run方法,并把这个接口类作为Thread类的构造函数参数创建一个线程,并调用start方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Thread2Methods implements Runnable {
@Override
public void run(){
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(i*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(new Thread2Methods(),"线程1");
Thread thread2 = new Thread(new Thread2Methods(),"线程2");
thread1.start();
thread2.start();
}
}

输出结果

1
2
3
4
5
6
7
8
9
10
线程2
线程1
线程2
线程1
线程1
线程2
线程1
线程2
线程2
线程1