Q:什么是进程和线程?
A:进程是所有线程的集合,每一个线程是进程中的一条执行路径,main也是线程,是主线程。
PS:线程之间互不干扰。
Q:为什么使用多线程?
A:提高应用程序的效率,比如下载软件的多下载任务可同时进行就是应用了多线程。
1.线程的生命周期
线程生命周期中有五个状态
a)创建(new Thread)
当用new操作符创建一个新的线程对象时,该线程处于创建状态。
处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。
处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。
b)就绪(runnable)
线程已经准备就绪,等待CPU为其分配资源。
start()即就绪。
c)运行(running)
线程获得CPU资源,正在按顺序执行代码。
d)阻塞(blocked)
因sleep()或wait()或其他线程join()等而使线程暂停执行让出资源进入等待,即阻塞。
sleep()时间结束或被唤醒nontify()或其他线程执行完毕,线程由阻塞状态进入就绪状态。
e)消亡(dead)
线程执行完毕,或被杀死,即进入消亡状态。
2.创建线程的三种方法
a)继承Thread类
ThreadDemo1.java
public class ThreadDemo1 extends Thread{
// 继承Thread类的线程类应重写run方法,在run方法中写入需要线程所运行的方法。
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("run i = " + i);
}
}
public static void main(String[] args) {
// 直接创建继承了Thread类的实例对象
ThreadDemo threadDemo = new ThreadDemo();
// 开始线程应当调用start()而不是调用run(),否则任然是顺序执行而不是同时执行。
threadDemo.start();
for(int i = 0; i < 100; i++) {
System.out.println("main i = " + i);
}
}
}
结果片段
main i = 0可以看出两个线程之间并不是完全交替执行,有时会某个线程多执行一会, 实际上是由CPU随机分配资源提供执行机会。
run i = 0
main i = 1
run i = 1
main i = 2
run i = 2
main i = 3
run i = 3
main i = 4
run i = 4
run i = 5
run i = 6
run i = 7
run i = 8
run i = 9
run i = 10
main i = 5
run i = 11
main i = 6
run i = 12
b)实现Runnable接口
ThreadDemo2.java
public class ThreadDemo2 {PS:由于java单继承多实现的特性,所以建议使用实现Runnable接口的方法创建线程。
public static void main(String[] args) {
// 创建实现了Runnable的线程类的实例对象
NewThread newThread = new NewThread();
// 创建Thread类的实例对象,传入newThread。
Thread t = new Thread(newThread);
// 调用start()方法开始线程
t.start();
for(int i = 0; i < 100; i++) {
System.out.println("main i = " + i);
}
}
}
class NewThread implements Runnable{
// 实现Runnable的线程类必须重写run()方法。
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("run i = " + i);
}
}
}
c)使用匿名类
ThreadDemo3.java
public class ThreadDemo3 {
public static void main(String[] args) {
// 传入一个重写了run()方法的Runnable对象,直接调用start()。
new Thread(new Runnable(){
@Override
public void run() {
for(int i = 0; i < 100; i++) {
System.out.println("run i = " + i);
}
}
}).start();
for(int i = 0; i < 100; i++) {
System.out.println("main i = " + i);
}
}
}