多线程基础知识第一篇:线程的状态

首先说一下为什么要使用多线程。

线程是CPU调度的基本单元,进程是系统资源分配的基本单元。一个程序作为一个进程来执行,程序运行过程中能够创建多个线程,而一个线程在一个时刻只能运行在一个处理器核心上。也就是说单线程程序只能使用一个处理器核心,那么加入再多的处理器核心也无法显著提升程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有效率。

线程的创建,有3种方式:继承Thread类、实现Runnable接口、实现Callable接口。

thread1.join():当前线程进入等待状态,等待thread1线程执行后再执行。

注意,join()方法要在start()之后再调用,否则不生效。

示例:

public static void main(String[] args) throws InterruptedException {
System.out.println(10);
Thread thread1 = new Thread(() -> {
System.out.println(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(2);
});
thread1.start();
thread1.join();
System.out.println(20);
}

如上,在main线程中执行thread1.join(),就告诉了main线程要等待thread1线程执行完,才能执行main线程后面的代码。如果join()方法有参数,则main线程会至多等待thread1线程指定时间,如果超过了这个时间thread1线程还没执行完,那么main线程也不等了,开始执行main线程后面的代码。

线程的状态

线程一共有6种状态,分别是NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,在Thread.State枚举中可以看到。

1、new:初始状态,线程创建后还没有调用start()方法时的状态。

2、runnable:运行状态,调用start()方法之后的状态。

3、blocked:阻塞状态,线程遇到synchronized同步代码块或者同步方法,但是获取不到监视器锁的状态。

4、waiting:等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作,通知或中断。

调用监视器锁的wait()方法的线程会进入waiting状态;在一个线程中调用另一个线程对象的join()方法,会使得该线程进入waiting状态;调用Condition实例的await()方法的线程,会释放掉Condition实例对应的锁,进入waiting状态。

5、timed_waiting:限时等待状态,同waiting状态不同,处于此状态的线程等待超过一段时间后会自动变为runnable状态。

进入waiting状态的方法加上时间,就会进入timed_waiting状态;Thread.sleep也会导致线程进入timed_waiting状态。

6、terminated:终止状态,线程执行完毕后的状态。

posted on 2015-07-08 17:30  koushr  阅读(249)  评论(0编辑  收藏  举报

导航