1.概念 |
- 线程是一个程序内部的顺序控制流
//线程和进程的区别
每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销
线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立运行的栈和程序计数器(PC),线程切换的开销小
多进程:在操作中系统中能同时运行多个任务(程序)
多线程:在统一应用程序中有多个顺序流同时执行
- java的线程是通过java.lang.Thread类来实现的
- vm启动时会有一个由主方法(public static void main(){})所定义的线程。
- 可以通过创建Thread的实例来创建新的线程。
- 每个线程都是通过某个特定的Thread对象对应的方法run()来完成其操作的,方法run()成为线程体
- 通过调用Thread类的start()方法来启动一个线程。
//实例
Public class{
public static void main(Sring[] args){
mi();
}
Public static void m1(){
m2();
m3();
}
Public static void m2(){}
Public static void m3(){
}
- 此程序执行的路径有几条?
- 1条,每一个分支是一个线程,main是主分支
2.线程的创建和启动 |
//方法1:
*定义线程类实现Runnable接口
//target为Runnable接口类型
*Thread myThread = new Thead(target)
*Runnable中只有一个方法:public void run();用来定义线程运行实体
*使用Runnable接口可以为多个线程提供共享数据。
*在实现Runnable接口中的类的run方法定义中可以使用Thread的静态方法(public static Thread currentThread()获取当前线程引用)
//方法2:
*定义一个Thread的子类并重写其run方法
class MyThread extends Thead{
public void run(){...}
}
*然后生成该类的对象
MyThread MyThread = new MyThread(...)
public class TestThread1{
public static void main(String args){
Runner1 r = new Runner1();
Thread t = new Thread(r);
//main方法运行到此处产生一个分支Runnable与main并行运行
t.start();
for(int i = 0;i<100;i++){
System.out.println("Main Thread:----"+i);
}
}
}
class Runner1 implements Runnable{
public void run(){
for(int i = 0;i<100;i++){
System.out.println("Runner1:"+1);
}
}
}
//线程启动必须调用thread类的start方法
结果:
public class TestThread1{
public static void main(String args){
Runner1 r = new Runner1();
r.run();
for(int i = 0;i<100;i++){
System.out.println("Main Thread:----"+i);
}
}
}
直接调用run方法运行结果:
线程启动方法2
结果:
3.小结 |
- 两种方式启动线程(从thread继承,实现runnable接口)
- 从thread继承,比较死,从这个类继承了以后就不能从其他的类继承了。接口比较灵活。