多线程
线程的创建方式
线程的创建方式有两种(官方api文档)
- 继承Tread类,并重写其中的run方法
- 实现Runnable接口,并重写run方法
还有两种是
- 通过线程池创建线程
- 实现Callable接口重写call方法
线程的启动
通过调用线程的start方法启动线程
继承Thread类
class PrimeThread extends Thread {
@Override
public void run() {
// compute primes larger than minPrime
. . .
}
}
...
PrimeThread p = new PrimeThread();
p.start();
实现Runnable接口
class PrimeRun implements Runnable {
public void run() {
// compute primes larger than minPrime
. . .
}
}
PrimeRun p = new PrimeRun();
new Thread(p).start();
一个线程不能被启动多次,如果已经启动然后再次启动,会抛出异常IllegalThreadStateException
线程的生命周期
创建,可执行,执行,堵塞,死亡
堵塞后不能直接进入执行状态,只会进入可执行的状态
参考博客:https://www.jianshu.com/p/468c660d02da
Thread 创建时的一些小知识
- 创建Thread时,默认有一个线程名,以Thread-开头,从0开始计时
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
- 如果在构造Thread时没有传递Runnable或者没有重写run方法,该Thread将不会调用任何东西
public void run() {
if (target != null) {
target.run();
}
}
- 如果构造线程对象时没有传入ThreadGroup,Thread会默认获取父线程的ThreadGroup作为该线程的ThreadGroup,此时子线程和父线程会在同一个ThreadGroup中
if (g == null) {
g = parent.getThreadGroup();
}