一般程序
我们之前的一般程序
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(); 来获取
道理一样,只不过多了一行代码