线程是程序执行流的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。太复杂了?简单理解为“线程是一个程序中的不同执行路径”就好了!
先来看看一个单线程的例子:
public class Thread01 {
public static void main(String[] args) {
f1();
System.out.println("----main----");
}
private static void f1() {
// TODO Auto-generated method stub
f2();
f3();
System.out.println("----f1----");
}
private static void f2() {
System.out.println("----f2----");
}
private static void f3() {
System.out.println("----f3----");
}
}
----f2---- ----f3---- ----f1---- ----main---- |
程序的执行过程:
方法调用与线程调用的区别就在方法调用是串行执行的,它总是执行完调用的方法后再继续执行当前方法;而线程调用是并行执行的,当前线程和调用的线程会交替执行。
创建线程的两种方法:1.实现Runable接口 2.继承Thread类
方式一:实现Runable接口
public class Thread02 {
public static void main(String[] args) {
Runner1 r1 = new Runner1();
Thread t = new Thread(r1);
t.start();
for (int i = 0; i < 100; i++) {
System.out.println("Main Thread:"+i);
}
}
}
class Runner1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread1:"+i);
}
}
}
输出结果:
方式二:继承Thread类
public class Thread03 {
public static void main(String[] args) {
Runner1 r1 = new Runner1();
r1.start();
for (int i = 0; i < 100; i++) {
System.out.println("Main Thread:"+i);
}
}
}
class Runner1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("Thread1:"+i);
}
}
}
一般情况下推荐使用实现Runable的接口来启用线程,因为这种方法更加灵活,继承就只能继承一个父类,而接口可以实现多个接口,实现接口后还可以继承。