Java 多线程最基本的类就是位于 java.lang 包下的 Thread 类 ,这个类继承 Object 类,实现了 Runnable。

public class Thread extends Object implements Runnable

Thread 有优先级的区分,优先级较高的线程优先于优先级较低的线程执行(但不是绝对的)。每一个线程都可以作为一个守护线程。

创建线程的方式有两种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}

public void run() {
// compute primes larger than minPrime
. . .
}
}

PrimeThread p = new PrimeThread(143);
p.start();

或者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}

public void run() {
// compute primes larger than minPrime
. . .
}
}

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

Thread 类有以下几种构造函数

1
2
3
4
5
6
7
8
Thread()
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
Thread(ThreadGroup group, String name)

Thread 可以接收一个 Runnable 的 target 作为参数,这样可以有效的将业务实现和 Thread 类进行解耦。所以推荐使用这种方式进行线程的创建。

name 参数可以指定该线程的名称,如果不指定 Thread 类将会调用 threadInitNumber 这个成员变量来计数当前线程的名称,第一个就是 thread-0,第二个就是 thread-1,依次类推。

ThreadGroup 定义了该线程属于哪个 group 中,同一组的线程可以批量停止或者挂起。

stackSize 是一个很有意思的参数。它是否起作用高度依赖于平台,在某些平台上该参数将不会起作用。简单的理解就是这个参数可以左右栈深度,较小的栈深度,JVM能支持更多的线程;较大的栈深度,单个线程拥有更大的递归深度,但是带来的是较少的线程同时存活。