一般程序
我们之前的一般程序
Person.java
package thread;
public class Person {
private String name;
public Person() {}
public Person (String name) {
this.name = name;
}
public void run() {
for (int i = 0;i < 20; i++) {
System.out.println(name + i);
}
}
}
Demo.java
package thread;
/**
* 主线程: 执行主方法(main方法)的线程
* 单线程程序: Java程序中只有一个线程的程序
* 从main方法中,从上到下依次执行
*
*
* 对于单线程程序
* JVM执行main方法, main方法会进入到栈内存,
* JVM会找操作系统开辟一条main方法通向cpu的执行路径
* CPU就可以通过这条路径, 执行main方法
* 这个路径就是main线程, 也就是主线程
*/
public class Demo01MainThread {
public static void main(String[] args) {
Person p1 = new Person("小强");
p1.run();
Person p2 = new Person("小明");
p2.run();
}
}
可以看到结果是按照顺序打印出来的,先执行p1 再执行p2
多线程程序
线程类: MyThread.java
package demo2Thread;
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("test" + i);
}
}
}
主程序类 Demo.java
package demo2Thread;
/**
* 创建多线程程序 我们可以继承Thread类的子类
* java.lang.Thread类, 是描述线程的类, 我们可以继承Thread类来实现多线程
*
* 1. 创建一个Thread类的子类
* 2. 在Thread类的子类中重写Thread类中的run方法, 设置线程任务(要执行的任务)
* 3. 创建Thread类的子类对象
* 4. 调用Thread类的start方法, 开启新的线程, 执行run方法
*
* void start() 使该线程开始执行; Java虚拟机调用线程的run方法
*
* 两个线程并发执行, 当前线程 (main线程) 和 另一个线程 (刚刚创建的线程) 一起执行
* 多次启动一个线程是非法的, 特别是当线程已经结束执行后, 不能重新启动
*
* Java程序属于抢夺式占用
*/
public class Demo01Thread {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 20; i++) {
System.out.println("main"+i);
}
}
}
可以看到结果
他是在两个线程之前来回切换,并发执行
线程类Thread的常用方法
1.getName() 获取线程名称
我们直接在run里边使用getName() 就可以获取线程名称
当然我们可以多写几个线程来看
使用Thread的currentThread(); 来获取
道理一样,只不过多了一行代码