Java 中的多线程简介:
1. Java 中的线程是通过 java.lang.Thread 类来实现的, 每一个 Thread 对象, 代表了一个新的主线程的线程.
2. Java 虚拟机启动时会有一个由主方法(public static void main(){})所定义的线程.
3. 可以通过创建 Thread 实例来创建新的线程.
4. 每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法 run() 称为一个线程体.
5. 通过调用 Thread 类的 Start() 方法来启动一个线程(每一个 Thread 对象代表一个新的线程).
线程的启动与创建:
1. 所定义的线程类实现 Runnable 接口, 然后将其传递给 Thread 的构造函数, 创建一个 Thread 对象(推荐使用此方法):
① 定义线程类实现 Runnable 接口;
② Thread myThread = new Thread(target) // target 为 实现了 Runnable 的接口类型;
③ Runnable 中只有一个方法:public void run(); // 用来定义线程运行体;
④ 使用 Runnable 接口可以为多个线程提供共享的数据;
⑤ 在实现 Runnable 接口的类的 run 方法中可以使用 Thread 的静态方法:
public static Thread currentThread(); // 获取当前线程的引用.
2. 直接继承 Thread 类:
① 可以定义一个 Thread 的子类, 并重写 run 方法,如:
class MyThread extends Thread {
public void run(){
}
}
② 之后生成该类的对象
MyThread myThread = new MyThread(....);
Demo_1:
// 第一种方法:直接实现 Runnable 接口 class TestThread { public static void main(String[] args){ Rnnner r = new Rnnner(); // r.run() 如果直接这样写,就变成了普通方法的调用 Thread tt = new Thread(r); tt.start(); for(int i = 0; i < 5; i++) { System.out.println("Main Thread------:"+i); } } } class Rnnner implements Runnable { public void run() { for(int i = 0; i < 5; i++) { System.out.println("Runner--------:" + i); } } }
运行结果:
Main Thread------:0
Runner--------:0
Main Thread------:1
Runner--------:1
Runner--------:2
Runner--------:3
Runner--------:4
Main Thread------:2
Main Thread------:3
Main Thread------:4
可以从运行结果中看出,二者交替输出,两个线程各执行一会.
Demo_2:
// 第二种方法:直接继承 Thread 类 public class TestThread { public static void main(String[] args) { Runner r = new Runner(); r.start(); for(int i = 0; i < 6; i++) { System.out.println("Main Thread-----:"+i); } } } class Runner extends Thread { public void run() { for(int i = 0; i< 8 ; i ++){ System.out.println("Runner-----:"+i); } } }
运行结果:
Main Thread-----:0
Runner-----:0
Main Thread-----:1
Runner-----:1
Main Thread-----:2
Runner-----:2
Main Thread-----:3
Main Thread-----:4
Main Thread-----:5
Runner-----:3
Runner-----:4
Runner-----:5
Runner-----:6
Runner-----:7
同一个线程类, 可以启动多个线程:
Demo_3:
class TT implements Runnable { int count = 0; @Override public void run() { for(int i = 1; i <= 3; i++){ System.out.println("Num. " +i); count ++; } } } class TestThread { public static void main(String[] args) { TT tt = new TT(); Thread t1 = new Thread(tt); Thread t2 = new Thread(tt); t1.start(); t2.start(); System.out.println("tt.count = "+tt.count); } }
运行结果:
tt.count = 0
Num. 1
Num. 1
Num. 2
Num. 3
Num. 2
Num. 3
Demo_4:
class TT implements Runnable { @Override public void run() { for(int i = 1; i <= 7; i++){ if(i % 3 == 0 && i != 0){ try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println("Num. "+i); } } } } class TestThread { public static void main(String[] args) { TT tt = new TT(); Thread t1 = new Thread(tt); t1.start(); } }
运行结果:
Num. 3
Num. 6